【问题标题】:python popen doesnt print stdoutpython popen不打印标准输出
【发布时间】:2015-03-09 18:19:59
【问题描述】:

我正在尝试将命令 racadam 从 dell(它的命令行工具)运行到 subprocess.popen。

但我无法取回标准输出或标准错误。这就是我正在做的。

prog = "C:\Program Files\Dell\SysMgt\\rac5\\racadm.exe"
pp = subprocess.Popen(prog, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
pp.communicate()
print pp.communicate()

print pp.communicate()[0]
print pp.communicate()[1]

print pp.stdout.readlines()
print pp.stderr.readlines()

out, err = pp.communicate()
print out
print err

我就明白了

('', '')


[]
[]

什么时候应该打印关于什么参数做什么的帮助。

有趣的是我可以看到程序终端打开,打印一些行,然后超级超级快地关闭。所以我知道程序正在运行我只是无法将信息返回给 python =(我可能错过了一些步骤吗?还是有什么隐藏的技巧?

谢谢大家。

【问题讨论】:

  • 什么是 prog,你为什么使用shell=True
  • tdout insert eat the "s" ,在shell中运行它并能够取回信息,我阅读的教程都使用shell=True。如果我做 False 我得到 WindowsError: [Error 740] The requested operation requires elevation
  • 我认为您缺少一些双反斜杠。在 c:、Files、Dell 之后。分配后打印出来以确保。
  • 做了,我确实得到了 C:\Program Files\Dell\SysMgt\rac5\racadm.exe 并且控制台运行良好,它甚至可以超快地打开控制台然后关闭,所以它抓住了右边.exe 文件。
  • 由于 racadm.exe 是一个需要 tty 的程序,您可能有兴趣阅读本文。 *.com/questions/14941749/… 。您的 tty 可能有问题。

标签: python subprocess popen


【解决方案1】:

不确定您在运行代码时是否真的写了tdout 而不是stdout

试试这个

pp = subprocess.Popen(prog, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = pp.communicate()
if pp.returncode == 0:
   final = out
else:
   final = err

print "Final output/Error is "+final

【讨论】:

  • 谢谢。我确实尝试过,这就是我得到的。最终输出/错误为 0 就像字符串中没有任何内容,例如 ""
  • 直接运行prog的输出是什么?
  • en.community.dell.com/techcenter/systems-management/w/wiki/… 应该类似于图片中的内容。我的返回码说 None =(
  • 我使用 .wait() 现在我得到返回码为 0