2013-02-11 1 views
0

프로세스에서 대화식 프로그램을 호출하고 프로세스가 실행되는 동안 해당 출력을 인쇄해야합니다. 지금까지,이 기능을하고 있어요 :대화 형 프로그램을 호출하고 즉시 출력을 표시하는 방법

def call(command): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

    while True: 
     line = process.stdout.readline().rstrip().encode("utf-8") 
     if line == '': 
      break 

     print(line) 

    process.wait() 
    return process.returncode 

문제이며, 대화 형 프로그램은 사용자 입력을 기다릴 수 있으며, 예를 들어, 질문 후 새 줄을 추가하지 않습니다 :

인증 영역 : ...> ...

아이디 :

"사용자 이름 :"후,이 새로운 라인이없고 프로그램이 사용자 입력을 기대하고 그래서 내 코드 D oes는 "사용자 이름 :"을 표시하지 않습니다.

readline() 대신 bytesavailable 및 read (size)와 같은 함수가 필요하지만 bytesavaiable()과 같은 함수는 없습니다.

+0

대신'통신 '을 사용하십시오. 또한 버퍼링 문제 (파이프가 꽉 찼기 때문에 프로그램이 멈추는 문제)를 방지합니다. – Cameron

+1

@Cameron'communicate'는 프로그램이 종료 될 때까지 출력이 필요하지 않으면 (프로세스가 완료된 후에 만 ​​리턴하기 때문에) 작동합니다. – Amber

+0

@Amber : 허, 블로킹이 아닌 블로킹을 할 수 있었지만 문서가 당신에게 옳았다는 것을 보여주었습니다 :-) – Cameron

답변

3

프로그램의 출력을 직접 캡처해야합니까, 아니면 사용자에게 표시 할 필요가 있습니까? 그냥 표시해야하는 경우, 프로세스가 표준 출력에 직접 쓰기시키는 단지 고려 :

process = subprocess.Popen(command, shell=True) 

이 깔끔하게 함께 자신의 통과 솔루션을 해킹 할 필요를 피할 수 있습니다. 이 프로그램의 출력을 캡처 할 필요성을 경우


, 당신은 단지 크기를 지정하지 않고 .read()를 호출 할 수 있습니다. 읽을 데이터가있을 때까지 (또는 스트림이 끝날 때까지 빈 문자열을 반환 할 때까지) 차단되지만, .readline()과 달리 반환 할 줄 끝까지 기다릴 필요는 없습니다.

+0

감사합니다! 내 버전이 확실히 과도하게 설계되었으므로 그냥 표시해야합니다 ... – osiris81

관련 문제