Python을 사용하여 스크립트를 전달하는 함수 + 매개 변수를 호출하는 방법

[머리말-넌센스]
최근에 파이썬을 플레이하다가이 문제가 발생했습니다. 인터넷에서 확인했습니다. 대부분의 블로그 게시물은 동일한 방법에 대해 이야기하고 있는데 반쯤 이해가되는 것 같아서 정렬이 필요하다고 생각합니다. 그것을 밖으로.


1. 문제 설명

Windows 아래에 있든 Linux에 있든 셸, Windows 아래에 powershell, Linux 아래에 bash 등이 있습니다. Windows의 Python은 IDLE을 가질 수 있지만 Linux의 Python은 일반적으로 그렇지 않습니다 (이것은 현재 제가 알고있는 내용이며 참조 용일뿐입니다. 부적절한 점이 있으면 언제든지 알려주세요).

때로는 이전에 작성한 Python 스크립트의 함수를 사용하고 싶을 때 이전 Python 스크립트를 수정하거나 Python 스크립트를 생성하여 이전 Python 스크립트의 함수를 호출하는 것을 원하지 않지만 사용하고 싶습니다. 쉘 직접 파이썬 스크립트에서 함수를 호출하고 함수에 매개 변수를 전달할 수 있습니다. 결국 대부분의 함수에는 매개 변수가 필요합니다. 이것은 이런 종류의 호소입니다!

할 수 있다면 (확실히 할 수는 있지만 글을 쓰는 시점에서는 그렇게하지 않을 것입니다) 저는 많은 일을 할 수 있습니다.

2. 셸에서 python 스크립트 실행

셸에서 python 스크립트를 실행하는 것은 쉽습니다. 간단한 python 스크립트를 살펴 보겠습니다.

#!/usr/bin/python3 
print("Hello, World!")

이 예는 신인에게서 발췌 한 것입니다. 첫 번째 줄에 대한 이해와 관련하여 위대한 신이 댓글에 썼습니다.

예제에서 코드 #! / usr / bin / python3의 첫 번째 줄에 대한 이해와 관련하여 :
두 가지 경우로 나뉩니다.
(1) 파이썬 스크립트가 호출되면 다음과 같이 사용됩니다.
python script.py#! / usr / bin / python 무시되며 주석과 동일합니다.
(2) 파이썬 스크립트를 호출 할 때
./script.py#! / usr / bin / python을 사용하여 인터프리터의 경로를 지정하십시오.

저는 매우 영감을 받았습니다.
이제 셸에서이 간단한 스크립트를 실행합니다.

  • Powershell
    여기에 사진 설명 삽입
    은 두 번째 명령을 인식하고 스크립트를 실행하지 않고 기본 응용 프로그램 (my time npp)으로 스크립트를 열었으므로 반환 값이없고 전체 인터페이스와 포커스가 npp로 이동합니다.
  • 세게 때리다
    여기에 사진 설명 삽입

3. 함수 호출

이 참고 자료 : https://blog.csdn.net/xuezhangjun0121/article/details/91958296
시도했지만 작동하지 않았습니다. https://www.bbsmax.com/A/LPdoKwVjd3/

예제를 실행하려면 첫 번째 링크를 따르십시오.

  • St1 : 파일을 port.py만들고 다음을 입력합니다.
#!/usr/bin/python
# port.py
 
import socket
 
def scan(port):
    s = socket.socket()
    s.settimeout(0.1)
    if s.connect_ex(('localhost', port)) == 0:
        return 'port: ' + str(port) + ' open'
    else:
        return 'port: ' + str(port) + ' not open'
    s.close()
 
if __name__ == '__main__':
  scan()
  • St2 : 입력 지침을 하나씩 :
checkresult=`python -c 'import port; print port.scan(80)'`
echo $checkresult
python -c 'import port; print port.scan(80)'

여기에 사진 설명 삽입

파일 만들고 mine.py내용을 입력하는 데 사용할 수 있는지 직접 작성하겠습니다 .

#!/usr/bin/python

def myfun(filepath,filename):
    longfilename=filepath+'/'+filename
    f=open(longfilename)
    flist=f.readlines()
    for line in flist:
        print(line)
    f.close()

if __name__ == "__main__":
    myfun()

그런 다음 새 텍스트 파일을 만들고 a.txt다음 내용을 입력합니다 (내용을 자연스럽게 입력).

Hello world!
I am Bill O'Hanlon
I am learning Python
I am very happy!
Nice to meet you!
Good bye!

그런 다음 전화 :

python -c 'import mine; mine.myfun(r"/home/ohanlon/Documents","a.txt")'

여기에 사진 설명 삽입
그러나 그것은 powershell에서 작동하지 않았습니다. 나는
여기에 사진 설명 삽입
현재 이유를 모릅니다. 그리고 powershell은 일반 쉘과 다른 것 같습니다. 내 목표는 달성되었으며이 질문은 잠시 제쳐두고 나중에 이야기하겠습니다.

4. sys 모듈을 통해 python 스크립트에 매개 변수 전달

이것은 비교적 간단합니다. 아래의 예를보십시오.

#test.py
import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
print(k);print(type(k))
print(y);print(type(y))
print(t);print(type(t))
------------------
python .\test.py 2.3 sfansifjdnj 4  #python3 powershell
python test.py $g $q $s   #python2 linux-bash

여기에 사진 설명 삽입
여기에 사진 설명 삽입
스크립트 실행 결과를 쉘 변수에 저장하려면 어떻게해야합니까?

a1=`python test.py $g $q $s`

파이썬 스크립트 실행 결과를 저장하기 위해 여러 변수를 사용하려면 어떻게해야합니까?

a1 a2 a3=`python test.py $g $q $s`

이것은 작동하지 않을 것입니다. 파이썬 스크립트의 실행 결과를 a1에 저장할 수 있습니다. 이때 a1은 문자열입니다.

4.76 <type 'float'> ndjknfkjs <type 'str'> 1 <type 'int'>

보시다시피 위의 인쇄물의 내용을 저장하지만 각 인쇄물의 내용을 공백으로 분리하고 직접 배열로 변환하면 그 사이에 공백이 있기 때문에 두 부분 array=($a1)으로 <type 'float'>나뉩니다. 이 경우 ;다음과 같이 출력에 대해 열심히 작업 할 수 있습니다. add .

import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
print(k); print(';');  print(type(k)); print(';')
print(y); print(';');  print(type(y)); print(';')
print(t); print(';');  print(type(t))

이런 식으로 a1은

4.76 ; <type 'float'> ; ndjknfkjs ; <type 'str'> ; 1 ; <type 'int'>

이후에 ;구분 문자 배열로 다음을 입력합니다.

array=(${a1//;/ })

나는 이것이 괜찮을 것이라고 생각했지만 array=(str})기본적으로 구분 기호로 공백이있는 배열로 문자열을 분할 하기 때문에 여전히 작동하지 않습니다 . 그런 다음 기본 구분 기호를 먼저 변경 한 다음 다시 변경해야합니다. 작업은 다음과 같습니다.

OLD_IFS="$IFS"
IFS=";"
array=($a1)
IFS="$OLD_IFS"
echo ${#array[@]}  #6
echo ${array[1]}   #<type 'float'>

확인!

5. 쉘의 변수를 python 함수에 전달

쉘의 변수가 파이썬 스크립트의 함수로 전달된다는 것을 어떻게 알 수 있습니까? 즉, 파이썬 스크립트에서 함수를 사용하고 싶지만이 함수를 스크립트에서 분리하기에는 너무 게으르지 만 직접 사용하고 싶습니다.
현재로서는 좋은 해결책이 없으며 게을러서는 안되는 것 같습니다.

요약하자면

Python 스크립트 scrpit.py는 일반적으로 다음과 같이 작성할 수 있습니다.

def function_name(param):
        return reparam
 
if __name__ == "__main__":
        function_name()  #其实这两行可以不要。

이전:

python -c 'import script; print script.function_name(param)'

또는:

result=`python -c 'import script; print script.function_name(param)'`
echo $result

셸의 변수는 python 스크립트로 전달됩니다.

import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
-------------
python test.py $g $q $s   #调用

파이썬 스크립트가 실행되면 결과가 출력됩니다 (인쇄 사용). 변수가 여러 개인 경우 원하는 구분 기호를 선택하고 여러 변수 사이에 추가합니다.print('分割符')

a1=`python test.py $g $q $s`
OLD_IFS="$IFS"
IFS=";"
array=($a1)
IFS="$OLD_IFS"

최종 결과는 문자 배열 (변수 당 하나의 인덱스)로 배열에 존재합니다.

추천

출처blog.csdn.net/Gou_Hailong/article/details/111091452