读取过程输出

时间:2012-12-15 19:38:57

标签: python console popen

我在python调试器(pdb)上编写一个简单的包装器,我需要解析pdb输出。但是我在从流程管道中读取文本时遇到了问题。

我的代码示例:

import subprocess, threading, time

def readProcessOutput(process):
    while not process.poll():
        print(process.stdout.readline())

process = subprocess.Popen('python -m pdb script.py', shell=True, universal_newlines=True,
                           stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
read_thread = threading.Thread(target=readProcessOutput, args=(process,))
read_thread.start()

while True:
    time.sleep(0.5)

当我在OS shell中执行给定命令(python -m pdb script.py)时,得到如下结果:

> c:\develop\script.py(1)<module>()
-> print('hello, world!')
(Pdb)

但是当我运行我的脚本时,我只获得两行,但无法获得pdb提示。在此之后向stdin写入命令无效。所以我的问题是: 为什么我看不懂第三行?如何避免此问题并获得正确的输出?

平台:Windows XP,Python 3.3

1 个答案:

答案 0 :(得分:2)

readline()无法读取第三行,因为它尚未在行尾终止。您通常会在“(pdb)”之后看到光标,直到您写入任何内容+ enter。

与具有某些提示的进程的通信通常更复杂。事实证明,我首先为数据写入器编写了一个独立的线程,以便更容易地测试通信,以确保如果尝试写入或读取太多,主线程永远不会冻结。然后它可以再次简化。