即使使用stdout = subprocess.PIPE,Subprocess.Popen也会在屏幕上吐出输出

时间:2015-03-19 15:32:18

标签: python

我使用多个命令来运行:

e.g。 cd foo/bar; ../../run_this -arg1 -arg2="yeah_ more arg1 arg2" arg3=/my/path finalarg

以:

运行
 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
(out, err) = p.communicate()

但这会在屏幕(Python 2.7.5)上吐出输出 而out是空字符串。

2 个答案:

答案 0 :(得分:0)

您有shell=True,因此您基本上读取了所生成的shell的标准输出,而不是您要运行的程序的标准输出。

我猜你正在使用shell=True来适应目录的变化。幸运的是,subprocess可以为您处理(通过cwd关键字参数传递目录):

import subprocess
import shlex
directory = 'foo/bar'
cmd = '../../run_this -arg1 -arg2="yeah_ more arg1 arg2" arg3=/my/path finalarg'
p = subprocess.Popen(shlex.split(cmd), cwd=directory, stdout=subprocess.PIPE)
(out, err) = p.communicate()

答案 1 :(得分:0)

根据评论我也添加了stderr,并且有效!:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT)