2009-07-06 2 views
4

stdin 및 stdout을 통해 앞뒤로 보낸 메시지를 통해 제어 할 외부 프로세스를 시작해야합니다. Subprocess.Popen을 사용하여 프로세스를 시작할 수 있지만 필요에 따라 실행을 제어 할 수 없습니다.STDIN/STDOUT을 통한 외부 프로세스 시작 및 제어

내가 완료하기 위해 노력하고있어의 흐름이다 :

  1. 다음 처리를 완료하기 위해 외부 프로세스에게 몇 가지 단계 수를

    1. 시작 외부 프로세스
    2. 으로 반복 새 줄 문자를 쓰는 것만으로 단계를 밟으십시오.
    3. 외부 프로세스가 stdout에 개행 문자를 작성하여 단계를 완료 할 때까지 기다립니다.
  2. 외부 프로세스의 stdin을 닫아 실행이 완료되었음을 외부 프로세스에 알립니다.

것은 내가 지금까지 다음과 같이 올라와있다 :

process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
for i in xrange(StepsToComplete): 
    print "Forcing step # %s"%i 
    process.communicate(input='\n') 

나는 '\ n을'이 외부 프로세스에 전달되지 않은 위의 코드를 실행하고 나는 결코 단계 # 0 이상으로 얻을 수없는 경우 . 코드는 process.communicate()에서 차단되고 더 이상 진행되지 않습니다. 내가 commun() 메서드를 잘못 사용하고 있습니까?

또한 "외부 프로세스가 새 줄을 쓸 때까지 대기"기능을 어떻게 구현합니까?

답변

8

process.communicate (input = '\ n') 잘못되었습니다. 파이썬 문서에서 알아 차리면 문자열을 자식의 표준 입력란에 기록한 다음 자식이 종료 될 때까지 자식에서 모든 출력을 읽습니다.

Popen.communicate (= 입력 없음) 프로세스와 인터랙트 : 표준 입력 데이터를 전송 doc.python.org 가입일. 파일 끝이 에 도달 할 때까지 stdout 및 stderr에서 데이터를 읽으십시오. 프로세스가 종료 될 때까지 기다리는 중입니다. 선택적 입력 인수는 자식 프로세스에 보낼 문자열이거나 자식에게 보낼 데이터가 없으면 없음, 문자열이어야합니다.

대신 자녀의 표준 입력란에 글을 쓰고 싶습니다. 그런 다음 루프에서 읽습니다. 이상과 같은

뭔가이 더 당신이 원하는 같은 것을 할 것입니다

process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
for i in xrange(StepsToComplete): 
    print "Forcing step # %s"%i 
    process.stdin.write("\n") 
    result=process.stdout.readline() 

.

+3

내가 처음이 작업을 수행 할 때 약간의 문제가 발생하는 이유는 몇 개의 문자 만 보내면 아무것도 전송되기 전에 스트림을 플러시해야 할 수 있다는 것입니다. – Kiv