Programing

인수를 전달하여 다른 Python 스크립트에서 Python 스크립트를 실행하십시오.

lottogame 2020. 3. 21. 10:10
반응형

인수를 전달하여 다른 Python 스크립트에서 Python 스크립트를 실행하십시오.


다른 Python 스크립트에서 Python 스크립트를 실행하고 싶습니다. 명령 줄을 사용하는 것처럼 변수를 전달하고 싶습니다.

예를 들어, 나는 값 (0, 1, 2, 3)의 목록을 반복 것입니다 내 첫 번째 스크립트를 실행하고 2 스크립트들을 통과 할 script2.py 0다음 script2.py 1등,

비슷한 질문 인 스택 오버플로 질문 1186789찾았 지만 ars의 답변은 함수를 호출합니다. 여기서 함수뿐만 아니라 전체 스크립트를 실행하려는 경우 balpha의 답변은 스크립트를 호출하지만 인수는 없습니다. 테스트로 이것을 아래와 같이 변경했습니다.

execfile("script2.py 1")

그러나 변수를 올바르게 받아들이지 않습니다. sys.argvscript2.py에서 인쇄하면 첫 번째 스크립트 "[ 'C : \ script1.py']에 대한 원래 명령 호출입니다.

원래 스크립트를 소유하고 있지 않기 때문에 원래 스크립트 (예 : script2.py)를 변경하고 싶지 않습니다.

나는 이것을 할 수있는 방법이 있어야한다고 생각한다. 나는 당신이 어떻게하는지 혼란 스럽습니다.


사용해보십시오 os.system:

os.system("script2.py 1")

execfile현재 실행 컨텍스트 에서 일련의 Python 문을 실행하도록 설계 되었기 때문에 다릅니다 . 그게 sys.argv당신을 위해 변하지 않은 이유 입니다.


이것은 본질적으로 잘못된 일입니다. 다른 Python 스크립트에서 Python 스크립트를 실행중인 경우 OS 대신 Python을 통해 통신해야합니다.

import script1

이상적인 세계에서는 내부에서 script1직접 함수를 호출 할 수 있습니다.

for i in range(whatever):
    script1.some_function(i)

필요한 경우 해킹 할 수 있습니다 sys.argv. 컨텍스트 관리자를 사용하여 영구적으로 변경하지 않도록하려면 깔끔한 방법이 있습니다.

import contextlib
@contextlib.contextmanager
def redirect_argv(num):
    sys._argv = sys.argv[:]
    sys.argv=[str(num)]
    yield
    sys.argv = sys._argv

with redirect_argv(1):
    print(sys.argv)

나는 이것이 모든 데이터를 OS로 전달하고 다시 전달하는 것이 바람직하다고 생각합니다. 그건 그냥 바보입니다.


이상적으로, 실행하려는 Python 스크립트는 다음과 같은 코드로 설정됩니다.

def main(arg1, arg2, etc):
    # do whatever the script does


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2], sys.argv[3])

즉, 경우 모듈이 명령 행에서 호출, 그것은 명령 줄 옵션을 구문 분석하고, 다른 함수를 호출 main()실제 작업을 수행. 실제 인수는 다양하며 구문 분석이 더 복잡 할 수 있습니다.

그러나 다른 Python 스크립트에서 이러한 스크립트를 호출하려는 경우 운영 체제를 통하지 않고 간단하게 직접 import호출 할 수 있습니다 modulename.main().

os.system 작동하지만 건포도없이 매번 완전히 새로운 파이썬 인터프리터 프로세스를 시작하므로 회전하는 ( "느린"읽기) 방법입니다.


서브 프로세스 모듈 :
http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module

import subprocess
subprocess.Popen("script2.py 1", shell=True)

이를 통해 stdin, stdout 및 stderr을 리디렉션 할 수도 있습니다.


좋은 습관은 다음과 같습니다.

import subprocess
cmd = 'python script.py'

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate() 
result = out.split('\n')
for lin in result:
    if not lin.startswith('#'):
        print(lin)

문서에 따르면 서브 프로세스 모듈을 사용하면 새로운 프로세스를 생성하고 입력 / 출력 / 오류 파이프에 연결하며 리턴 코드를 얻을 수 있습니다. 이 모듈은 몇 가지 이전 모듈 및 기능을 대체하려고합니다.

os.system
os.spawn*
os.popen*
popen2.*
commands.*

자식 프로세스를 채우고 차단하는 다른 OS 파이프 버퍼로 인한 교착 상태를 피하려면 .stdin.write, .stdout.read 또는 .stderr.read 대신 communi ()을 사용하십시오. 여기를 읽으십시오


import subprocess
subprocess.call(" python script2.py 1", shell=True)

os.system이 충분히 강력하지 않으면 하위 프로세스 모듈이 있습니다.

참고 URL : https://stackoverflow.com/questions/3781851/run-a-python-script-from-another-python-script-passing-in-arguments


반응형