2016-08-09 2 views
1

파이썬 용 IDE를 작성 중이며 사용자 스크립트와 상호 작용하기 위해 서브 프로세스를 사용해야합니다.subprocess를 사용하여 파이썬 스크립트와 상호 작용하는 방법

나는 서브 프로세스를 사용하는 것에 완전히 익숙하지 않으며 내가 여기서 뭘하고 있는지 확실하지 않다.

from subprocess import Popen,PIPE,STDOUT 
import tkinter as tk 

t=tk.Text() 
t.pack() 

p = Popen(["python","c:/runme.py"],stdout=PIPE,stdin=PIPE,stderr=PIPE,shell=True) 
p.stdin.write("5".encode()) 
out=p.stdout.read() 

t.insert(1.0,out) 

을 그리고 여기에 내가와 상호 작용하기 위해 노력하고있어 테스트 스크립트입니다 : 그냥 기다리고 불행하게도

print("Hello World") 
inp=input("Enter a Number: ") 
print(inp) 
quit() 

아마 (내가 할 노력하고있어 나타내는 테스트 조각을 만들었습니다). 2 번 줄에 이미 인쇄 된 내용과 문자열을 입력하는 방법은 무엇입니까?

import sys 
print("Hello World") 
print("Enter a Number: ") 
stdout.flush() 
inp = input() 
print(inp) 

당신은 반환 \n하여 입력을 종료해야합니다 : 스크립트가 터미널에 연결되지 않은 경우, 출력이 자동으로 플러시되지 않기 때문에

답변

2

당신은 정기적으로 표준 출력을 플러시해야

p = Popen(["python", "c:/runme.py"], stdout=PIPE, stdin=PIPE, stderr=PIPE) 
p.stdin.write("5\n".encode()) 
out = p.stdout.read() 
+0

'stdout'은'sys' 모듈에 있고'p.stdin'도'write()'다음에 플러시되어야합니다. 내 대답의 다른 모든 부분은 당신과 같습니다 :) – Cychih

2

shell=True을 제거하십시오. 현재는 이 아니며은 스크립트를 실행하지만 python 대화식 인터프리터를 시작합니다.

문제는 when you use shell=True the way in which the first argument is interpreted changes.shell=True이 필요하지 않으며 제공 한 인수가 shell=False 버전에 맞습니다. 당신이 걸리면 파이썬 인터프리터를 시작 알 수 있습니다으로

>>> import subprocess 
>>> subprocess.Popen(['python', 'whatever'], shell=True) 
<subprocess.Popen object at 0x7ff1bf933d30> 
>>> Python 2.7.12 (default, Jul 1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
KeyboardInterrupt 
>>> 
KeyboardInterrupt 

,이 :

>>> import subprocess 
>>> subprocess.Popen(['python', 'whatever']) 
<subprocess.Popen object at 0x7f14e1446cf8> 
>>> python: can't open file 'whatever': [Errno 2] No such file or directory 

whatever을 실행하려고

는 차이를 참조하십시오.


또한 대신 독서의 communicate 방법을 사용하고 stdin/stdout로/직접 작성하는 것이 좋습니다.

+0

'shell = True'를 제거하고 읽고 쓰기 전에 작성했습니다. 이제 내 문제는 입력 프롬프트가 무엇인지 읽을 수 없다는 것입니다. 읽을 수 있기 전에 작성해야합니다. 파일이 입력을 기다리는 동안 읽는 방법이 있습니까? 그런 다음 해당 파일에서 사용자 입력을 프로세스로 "전달"하시겠습니까? –

+0

@HaydenR 프롬프트가'input'으로 플러시되지 않는 것이 문제 일 수 있습니다. 'sys.stdout.write (prompt); sys.stdout.flush(); input()'을 사용하여'input (prompt)'을 변경하고 그 차이가 있는지보십시오. 그럴 경우 프롬프트를 플러시하는'input' 주위에 간단한 래퍼를 작성해야합니다. – Bakuriu

관련 문제