我正在开发一个实现cmd窗口的python程序。 我在PIPE中使用subproccess。 例如,如果我写“dir”(通过stdout),我使用communic()来获取cmd的响应,它确实有效。
问题是,在一段时间的True循环中,这不会超过一次,似乎子进程自行关闭.. 请帮帮我
import subprocess
process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)
x=""
while x!="x":
x = raw_input("insert a command \n")
process.stdin.write(x+"\n")
o,e=process.communicate()
print o
process.stdin.close()
答案 0 :(得分:0)
主要问题是当程序仍在运行时尝试读取subprocess.PIPE
死锁但是没有什么可以从stdout中读取。 communicate()
手动终止进程以停止此操作。
解决方案是将读取stdout的代码放在另一个线程中,然后通过Queue访问它,这样可以通过超时而不是死锁来在线程之间可靠地共享数据。
新线程将连续读取标准输出,当没有更多数据时停止。
将从队列流中抓取每一行,直到达到超时(队列中没有更多数据),然后行列表将显示在屏幕上。
此过程适用于非交互式程序
import subprocess
import threading
import Queue
def read_stdout(stdout, queue):
while True:
queue.put(stdout.readline()) #This hangs when there is no IO
process = subprocess.Popen('cmd.exe', shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
q = Queue.Queue()
t = threading.Thread(target=read_stdout, args=(process.stdout, q))
t.daemon = True # t stops when the main thread stops
t.start()
while True:
x = raw_input("insert a command \n")
if x == "x":
break
process.stdin.write(x + "\n")
o = []
try:
while True:
o.append(q.get(timeout=.1))
except Queue.Empty:
print ''.join(o)