2017-09-16 7 views
2

파이썬 3.5를 사용하여 대화식 명령 줄 응용 프로그램과 인터페이스하려고합니다. 아이디어는 파이썬 스크립트의 시작 부분에서 프로세스를 시작하고 열어 두는 것입니다. 루프에서, 나는 파일 경로를 출력하고, 그 다음에 라인 반환을하여 stdin으로 보내고, 처리 할 때까지 0.25 초 정도 기다린 다음, 새 라인에 도달 할 때까지 stdout에서 읽는다.파이썬 하위 프로세스 : stdin으로 인쇄하고, 개행까지 stdout을 읽고, 반복하십시오.

이것은 communicate 기능과 매우 비슷하지만 subprocess 기능과 비슷하지만 프로세스가 종료 될 때까지 기다리는 대신 줄 반환을 기다리고 있습니다. 누구든지이 작업을 수행하는 비교적 간단한 방법을 알고 있습니까?

편집 : 가능한 경우 pexpect과 같은 타사 라이브러리가 아닌 표준 라이브러리를 사용하는 것이 좋습니다.

+4

'pexpect' 모듈을 보았습니까? –

+0

@JonClements 이전에 SSH 용으로 사용해 왔습니다. 그러나 나는 이것을 위해 그것을 조사 할 것이다. 고맙습니다! –

+0

아직 ...'pexpect'를 사용하십시오. 표준 라이브러리의 사용을 권장 할 수없는 이유는 엄청난 복잡성 때문입니다. –

답변

2

이 경우 subprocess.Popen을 사용할 수 있습니다. 이 같은

뭔가 :

proc = subprocess.Popen(['my-command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

이제 proc.stdinproc.stdout가 서브 프로세스의 표준 입력으로 데이터를 전송하고, 서브 프로세스의 표준 출력에서 ​​읽을 파이프의 당신의 끝입니다.

줄 바꿈 문자를 읽는 데에만 관심이 있으므로 버퍼링으로 인한 문제를 해결할 수 있습니다. 버퍼링은 하위 프로세스를 사용하여 대화 형 프로세스와 통신 할 때 큰 문제 중 하나입니다. 보통 I/O는 라인 버퍼입니다. 즉, 서브 프로세스가 개행 문자로 행을 종료하지 않으면 proc.stdout에 데이터가 표시되지 않으며 그 반대의 경우도 proc.stdin으로 작성됩니다. 사용자가있는 경우 표시되지 않을 수도 있습니다. 개행 문자로 끝나지 않습니다. 버퍼링을 해제 할 수는 있지만 플랫폼에 독립적이지는 않습니다.

해결해야 할 또 다른 문제점은 서브 프로세스가 입력을 기다리고 있는지 또는 파이프에서 쓰거나 읽는 것 외에는 출력을 보냈는지 여부를 판별 할 수 없다는 것입니다. 따라서 두 번째 스레드를 시작하여 proc.stdout에 대한 출력을 기다리고 동시에 두 프로세스가 파이프 입출력에서 블로킹하기 때문에 교착 상태로 실행하지 않고 proc.stdin에 동시에 쓸 수 있습니다 (또는 Unix 파일 핸들을 사용하여 select를 지원하는 경우 select을 사용하여 수신 할 준비가되었거나 읽을 준비가 된 파이프를 결정합니다.

0

이것은 이벤트 루프의 작업처럼 들립니다. subprocess 모듈은 복잡한 작업 하에서 그 변형을 보여주기 시작합니다.

나는 다음과 같은 하위 클래스, 트위스트와 함께이 일을했습니다 트위스트에 대한

twisted.internet.endpoints.ProcessEndpoint 
twisted.protocols.basic.LineOnlyReceiver 

대부분의 문서는 엔드 포인트로 소켓을 사용하지만 프로세스의 코드를 조정하기 어렵지 않다.