IT이야기

다른 Python 스크립트에서 Python 스크립트 실행, 인수 전달

cyworld 2022. 3. 13. 11:01
반응형

다른 Python 스크립트에서 Python 스크립트 실행, 인수 전달

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

예를 들어, 값 목록(0,1,2,3)을 반복하여 두 번째 스크립트로 전달하는 첫 번째 스크립트를 실행하겠다.script2.py 0그때script2.py 1

Stack Overflow 질문 1186789도 비슷한 질문이지만, ARS의 답변은 함수를 부르는데, 내가 전체 대본을 실행하고자 할 때 함수를 부르는데, 발파의 답변은 단순히 함수가 아니라 논쟁 없이 대본을 부른다.나는 이것을 시험 삼아 다음과 같은 것으로 바꾸었다.

execfile("script2.py 1")

그러나 변수를 제대로 수용하지 못하고 있다.인쇄할 때sys.argvscript2.py에서는 첫 번째 스크립트 "['C:\script1.py]에 대한 원래 명령 호출이다.

원본 스크립트(예: 내 예에서는 script2.py)는 소유권이 없기 때문에 변경하고 싶지 않다.

나는 이것을 하는 방법이 분명히 있을 것이라고 생각한다; 나는 단지 네가 그것을 어떻게 하는지 혼란스러울 뿐이다.

사용 시도:

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(), 실제 작업을 하기 위해서. (실제 주장은 다양할 것이고, 파싱이 더 관여할 수도 있다.)

그러나 다른 파이톤 스크립트에서 이러한 스크립트를 호출하려면 간단히 할 수 있다.import그것을 부르고 또 부르다.modulename.main()운영 체제를 거치지 않고 직접.

os.system건포도를 사용하지 않기 위해 매번 완전히 새로운 파이톤 통역 과정을 시작하고 있기 때문에, 그것을 하는 것은 회전교차로다.

나는 좋은 연습이 이런 것일 수도 있다고 생각한다.

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.*

.stdin 대신 communication()을 사용하십시오.하위 프로세스를 채우고 차단하는 다른 OS 파이프 버퍼로 인해 교착 상태가 발생하지 않도록 쓰기, .stdout.read 또는 .stderr.read.여기서 읽기

하위 프로세스 모듈:
http://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
subprocess.call(" python script2.py 1", shell=True)

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

반응형