파이썬 스크립트에서 무언가를 "반환"하고 싶을 때 가장 좋은 방법이 무엇인지 알고 싶습니다.파이썬 subprocess.Popen : sys.stdout 대 .txt 파일 대 Cpickle.dump
여기 내 문제입니다. subprocess.Popen 메서드를 사용하여 parentScript에서 Python childScript를 실행하고 있습니다. 첫 번째 스크립트를 실행하여 두 개의 부동 소수점을 하나씩 얻고 싶습니다.
child.py :
if __name__ == '__main__':
myTuple = (x,y)
sys.stdout.write(str(myTuple[0]) +":"+str(myTuple[1]))
sys.stdout.flush()
parent.py :
지금, 본 첫 번째 방법은 다음과 서브 프로세스 함수 sys.stdout와 파이프를 사용하는 것이다
p = subprocess.Popen([python, "child.py"], stdout=subprocess.PIPE)
out, err = p.communicate()
here 비록 대부분의 경우에는 권장되지 않지만 이유는 모르겠다 고합니다 ...
두 번째 방법은 내 튜플을 Script1.py의 텍스트 파일에 쓰고 Script2.py에서 엽니 다. 하지만 필자는 파일을 쓰고 읽는 데 약간의 시간이 걸리는 것 같아서 더 좋은 방법인지는 모르겠다.
마지막으로 CPickle을 사용하고 내 튜플을 덤프하고 script2.py에서 열 수 있습니다. 텍스트 파일을 사용하는 것보다 조금 빠르지 만 sys.stdout을 사용하는 것보다 낫겠습니까?
올바른 방법은 무엇입니까?
--------------------------------------- EDIT ------ ------------------------------------------
내가 깜박했다. parent.py는 실제로 폴더에서 child.py를 생성하기 때문에 import를 사용할 수 없다. 실제로 나는 다중 처리를하고있다.
parent.py는 child.py가 각각 복사되는 10 개의 디렉토리를 만듭니다. 그런 다음 여러 프로세서에서 parent.py의 child.py를 실행합니다. 그리고 모든 child.py에 의해 "반환 된"결과를 모으기를 원합니다. 그래서 parent.py는 아직 생성되지 않았기 때문에 child.py를 import 할 수 없거나, 일종의 dynamic import를 할 수 있습니까? 모르겠다. ...
-------------------------------------- -EDIT2 -----------------------------------------------
왜 이런 식으로 진행되는지에 대한 질문에 대답하는 또 다른 편집. Child.py는 실제로 ironpython과 .Net 어셈블리를 실행하는 다른 스크립트를 호출합니다. 특정 폴더에있는 모든 child.py 파일을 복사해야하는 이유는이 어셈블리가 자체적으로 사용되는 리소스 파일을 생성하기 때문입니다. 각 하위 폴더에서 child.py (및 어셈블리를 복사하지 않으면) 다중 프로세스 모듈을 사용하여 여러 프로세스를 호출 할 때 충돌을 만드는 리소스 파일이 루트에 복사됩니다. 이 전반적인 아키텍처에 대한 몇 가지 제안 사항이 있으시면 환영받는 것 이상입니다. :)
:
subprocess
모듈을 사용하여 어셈블리 일반적으로'script1.py','script2.py','float1','좋은 이름 float2' 수 없습니다. 더 구체적으로 염두에 두지 않으면 숫자에 대해'numbers' 또는'x, y'를 쓰면 스크립트에'child.py','parent.py'를 사용할 수 있습니다. – jfs좋아, 지금 편집 중이거나 보완 중입니다. 감사합니다. – Serge