PYTHON 子进程 cmd.exe 在第一个命令后关闭

PYTHON subprocess cmd.exe closes after first command

我正在开发一个 python 程序,它实现了 cmd window。 我正在使用带有 PIPE 的子进程。 例如,如果我写 "dir"(通过标准输出),我使用 communicate() 以便从 cmd 获得响应并且它确实有效。

问题是在 while 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()

主要问题是当程序仍然是 运行 但没有任何东西可以从 stdout 读取时,试图读取 subprocess.PIPE 死锁。 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)