2011-07-06 1 views
2

네트워크로 호출되는 파이썬 스크립트가 있습니다. 이 스크립트는 일부 데이터를 입력 스트림으로 가져오고 일부 데이터를 출력 하나 - stdin 및 stdout으로 보냅니다.파이프 제어 기능이있는 Python exec 명령

이제이 스크립트가 다른 스크립트를 호출하기를 원합니다. 그리고 그의 표준을 아동 과정과 아동의 표준 출력으로 되돌려줍니다. 기본적으로 이것은 스크립트와 같은 프록시가 될 것입니다.

가장 중요한 순간은 전송할 데이터 크기입니다. 그것은 거대합니다 - 그래서 나는 버퍼를 사용할 수 없습니다. 예를 들어, 하위 프로세스에서 1GB의 데이터를 전송한다고 가정 해 보겠습니다. 부모 스크립트는 준비된 자식의 stdout을 가져올 수 있어야하며이 데이터를 자신의 stdout으로 전달할 수 있어야합니다.

같은 문제는 stdin-parent가 많은 양의 데이터를 받고 자식에게 보내기 전에 버퍼링 할 수 없다는 것입니다.

질문은 이것을 Python으로 구현하는 방법입니까?

import sys 
from subprocess import * 
if __name__ == "__main__": 

    network_content = sys.stdin.read() 
    p = Popen("python other_script.py",stdin=PIPE, stdout=PIPE, stderr=PIPE, 
      close_fds=True) 
    child_stdin,child_stdout = p.communicate() 
    child_stdin.write(network_content)  
    child_content = child_stdout.read() 
    sys.stdout.write(child_content)  

메모리에 모든 데이터를 유지하면되는 문제는 다음에 읽을 : 데이터를 다음 사용하여 프록시를 구현할 수 완전히 다시 보내기 전에 읽어야 할 필요가있는 경우

+0

다른 스크립트 파이썬 코드 또는 다른 것이 있습니까? 그렇다면 동일한 프로세스에서 실행할 수 있습니까? –

+0

아니요, 이것은 컴파일 된 C 프로그램 – user349302

답변

0

감사합니다 블록을 만들고 TMP 파일로 덤프하고 해당 파일에서 child_stdout에 쓸 수 있습니다 (블록 단위).

+0

입니다. 불행히도 이것은 송수신을위한 단 하나의 사이클이있는 경우에만 작동합니다 -하지만 대화를 구성 할 수 있기를 원합니다 - 그래서 프록시는 읽기에서 std가 완료되었는지를 모릅니다 ... . – user349302