Python2:subprocess.Popen()有另一个输出,因为它直接在控制台上运行

时间:2015-03-13 12:07:10

标签: python shell python-2.7 windows-7-x64 python-2.x

当我在控制台中运行程序时,我会得到一些文本输出。 当我在Popen(..)中运行相同的程序时,使用相同的参数,stdout和stderr为空。

我尝试了所有我能想象的东西,比如shell = False和shell = True,设置stdout = subprocess.PIPE,做一个os.chdir()来改变这个程序的目录,试试p.wait()和p。 communic(),将命令设置为列表和字符串,但没有任何作用。

示例:

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out, err = p.communicate()

- > out和err是空字符串,但如果我在控制台中运行此命令,我会得到一个真正的输出。命令是带有完整路径的,因此它无论命令将在何处启动。

我的问题是,有没有机制让程序检测到它们没有在真正的控制台中运行?如果是这样,我怎么能作弊。

还是想念我?

(Win7 x64中的Python 2.7.8.x32)

1 个答案:

答案 0 :(得分:0)

from subprocess import Popen, STDOUT, PIPE
p = Popen(command, shell=True, stdout=PIPE, stderr=STDOUT, stdin=PIPE)
while p.poll() is None:
    print(p.stdout.read())
p.stdout.close()
p.stdin.close()

试试这个,看看它是否有所不同。同时确保command是一个字符串而不是列表/ touple,shell=True无论出于何种原因效果更好或仅使用字符串。 另请注意,shell=True会让你被绞死,因为它不安全等等。

同时跳过.communicate()您需要点按stdout,否则缓冲区将会变满,您可能会挂起自己和子进程。


如果这不起作用,请提供更多信息。例如使用的命令和预期的输出(至少前几行)