인수를 전달하여 다른 Python 스크립트에서 Python 스크립트를 실행하십시오.
이 질문에는 이미 답변이 있습니다.
다른 Python 스크립트에서 Python 스크립트를 실행하고 싶습니다. 명령 줄을 사용하는 것처럼 변수를 전달하고 싶습니다.
예를 들어, 나는 값 (0, 1, 2, 3)의 목록을 반복 것입니다 내 첫 번째 스크립트를 실행하고 2 스크립트들을 통과 할 script2.py 0
다음 script2.py 1
등,
비슷한 질문 인 스택 오버플로 질문 1186789 를 찾았 지만 ars의 답변은 함수를 호출합니다. 여기서 함수뿐만 아니라 전체 스크립트를 실행하려는 경우 balpha의 답변은 스크립트를 호출하지만 인수는 없습니다. 테스트로 이것을 아래와 같이 변경했습니다.
execfile("script2.py 1")
그러나 변수를 올바르게 받아들이지 않습니다. sys.argv
script2.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이 충분히 강력하지 않으면 하위 프로세스 모듈이 있습니다.
'Programing' 카테고리의 다른 글
Lisp 매크로를 그렇게 특별하게 만드는 것은 무엇입니까? (0) | 2020.03.21 |
---|---|
git pull과 git pull --rebase의 차이점 (0) | 2020.03.21 |
Bootstrap 3을 사용하여 AngularJS에서 그리드 또는 테이블을 나타내는 가장 좋은 방법은 무엇입니까? (0) | 2020.03.21 |
C #에서 스택 추적을 잃지 않고 InnerException을 다시 발생시키는 방법은 무엇입니까? (0) | 2020.03.21 |
동적 표현식을 컴파일하는 데 필요한 하나 이상의 유형을 찾을 수 없습니다. (0) | 2020.03.21 |