通过不使用通信的子进程捕获输出

Posted

技术标签:

【中文标题】通过不使用通信的子进程捕获输出【英文标题】:Capture output via subprocess w/o using communicate 【发布时间】:2012-05-22 21:42:23 【问题描述】:

我正在使用子进程调用 Python 脚本中的外部程序。外部程序产生大量输出。我需要捕获这个程序的输出。当前的代码是这样的:

process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=None)
process.stdin.write('gams "indus89.gms"\r\n')
while process.poll() != None:
    line = process.stdout.readline()
    print line

我在这段代码中遇到的错误是

进程试图写入一个不存在的管道。

如果我使用以下代码:

process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=None)
process.stdin.write('gams "indus89.gms"\r\n')
o, e = process.communicate()
print o 

那么程序的输出不会被捕获。

我应该如何更改我的代码,以便在第三方程序运行时捕获它的输出?

【问题讨论】:

你为什么用cmd.exeshell=False,为什么不用'gams "indus89.gms"'shell=True 【参考方案1】:

Popen 太过分了。

试试:

output = subprocess.check_output('gams "indus89.gms"\r\n', shell=True)

希望这将适用于您的环境。

【讨论】:

我试过了,但仍然无法捕获我需要捕获的输出。 抱歉,我运行的是旧代码。现在一切正常。谢谢你的帮助..

以上是关于通过不使用通信的子进程捕获输出的主要内容,如果未能解决你的问题,请参考以下文章

从Java开始忽略/捕获子进程输出的最简单方法

同一父进程下的子进程之间的通信(pipe通信)

如何在其他网络命名空间中的子进程与父进程之间正确通信?

捕获stdout以获取远程进程的子进程

python子进程中的多个输入和输出通信

启动包含管道命令的子进程时找不到文件错误