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

时间:2015-06-05 19:01:38

标签: python cmd subprocess stdout stdin

我正在开发一个实现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()

1 个答案:

答案 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)