2009-10-28 5 views
0

파이썬 및 서브 프로세스 모듈을 통해 제어하려고하는 응용 프로그램이 있습니다. 기본적으로 Popen (프로그램이 실행되는 명령 프롬프트를 여는)을 사용하여 응용 프로그램을 시작한 다음 나중에 실행중인 시점에서 해당 프로그램의 STDIN에 문자열 (명령)을 전송해야합니다 . 파이썬이 시작한 응용 프로그램의 명령 창에 단추를 수동으로 입력 할 때까지 명령이 처리되지 않는다는 점만 제외하면 잘 작동합니다. 여기 내 코드의 일부입니다 :문제 Windows에서 Python의 subprocess.communicate() 사용

cmd = 'quit\n' 
app.communicate(cmd.encode('utf-8')) 

어떤 아이디어?

편집 # 1

예는 버튼을 입력하는 것은 혼란을 드려 죄송 키보드의 키를 누르 의미한다. 내가

아래 내 코드의 자세한 내용을 첨부했습니다
app = Popen(['runProg.exe', '-m', '20'], stdin=PIPE, universal_newlines=True) 
while not os.path.exists('C:/temp/quit-app.tmp'): time.sleep(1) 
app.communicate('quit') 
os.remove('C:/temp/quit-app.tmp') 

그래서 어떻게해야 무엇을 종료-app.tmp 파일이 생성 될 때까지 실행해야하는 프로그램입니다; 일단 만들어지면 "quit"이 응용 프로그램에 보내 져야합니다. 응용 프로그램은 깨끗하게 종료되는 명령입니다. 인간이이 프로그램을 실행했다면 명령 창에 "quit"을 입력하면됩니다. 감사!

+0

"버튼 입력"은 키 (키보드)를 누르는 것이 아니라는 것을 확인할 수 있습니까? 그렇지만 혼란을 피하기 위해서입니다. 그것은 정상적인 콘솔 응용 프로그램입니까? Popen 전화는 어떻습니까? 어쩌면 코드를 더 붙여 넣을 수도 있습니다. – RedGlyph

답변

0

시도 :

cmd = 'quit\n\r' 

편집 :

나를 위해 노력하고 있습니다

만 것입니다 : documentation 말한대로

app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
app.stdin.write('exit\r\n') 

때문에 :

Popen.communicate (입력 = 없음)

프로세스와 상호 작용 : 데이터를 stdin으로 보냅니다. 파일 끝에 도달 할 때까지 stdout 및 stderr에서 데이터를 읽습니다. 프로세스가 종료 될 때까지 기다립니다. 선택적 입력 인수는 자식 프로세스에 보낼 문자열 이거나 자식에게 보낸 데이터가 없으면이어야합니다.

+0

좋아, 나는 그것을 시도하고 나는 여전히 동일한 문제가 있습니다. 그래도 고마워! – Bozzy

+0

이론적으로는 '\ r \ n'이 아니라'\ n \ r'이 아니라 응용 프로그램에 차이가 있는지 확실하지 않습니다. 문자열을 변환하지 않으려면 Popen을 호출 할 때 선택적 universal_newlines 매개 변수를 True로 설정할 수 있습니다. 일반적으로 Windows에서 파이프는 바이너리 모드로 열립니다. 실제로이 옵션을 사용하지 않으면 bua가 제안한대로 (분명히 뭔가 다른 것)해야합니다. 그래서 문제와 상관없이이 옵션을 사용하거나'\ r \ n'을 추가하십시오. – RedGlyph

+0

마지막 업데이트를 검토하십시오. – bua