다른 Python 스크립트에서 Python 스크립트 실행, 인수 전달
나는 다른 파이톤 스크립트에서 파이톤 스크립트를 실행하고 싶다.명령줄을 사용하는 것처럼 변수를 전달하고 싶다.
예를 들어, 값 목록(0,1,2,3)을 반복하여 두 번째 스크립트로 전달하는 첫 번째 스크립트를 실행하겠다.script2.py 0
그때script2.py 1
등
Stack Overflow 질문 1186789도 비슷한 질문이지만, ARS의 답변은 함수를 부르는데, 내가 전체 대본을 실행하고자 할 때 함수를 부르는데, 발파의 답변은 단순히 함수가 아니라 논쟁 없이 대본을 부른다.나는 이것을 시험 삼아 다음과 같은 것으로 바꾸었다.
execfile("script2.py 1")
그러나 변수를 제대로 수용하지 못하고 있다.인쇄할 때sys.argv
script2.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)
'IT이야기' 카테고리의 다른 글
반응 - 무거운 하위 구성 요소 렌더링 지연 (0) | 2022.03.13 |
---|---|
여러 경로를 반응 라우터 v4와 일치 (0) | 2022.03.13 |
create-react-app을 실 대신 npm으로 만드는 방법? (0) | 2022.03.13 |
동일한 컴포넌트를 동적으로 반응 (0) | 2022.03.13 |
Vue 라우터 조건부 리디렉션? (0) | 2022.03.13 |