【问题标题】:Getting (in Python) the text output of executing a CMD command from Python获取(在 Python 中)从 Python 执行 CMD 命令的文本输出
【发布时间】:2014-11-25 16:39:53
【问题描述】:

我正在尝试通过 Python 运行 Bazaar 版本控制。为此,我一直在使用“os.system('')”(尽管我现在认为这不是通过命令提示符运行的推荐命令)。

对于一个部分,我想运行命令“BZR commit [file] -m '[text]'”。这将运行 Bazaar 并使用消息 [text] 提交对 [file] 所做的更改。运行时,Bazaar 在命令提示符中打印几行文本,基本上说明它是否成功。

使用“os.system('[message]')”(其中 [message] 是前面提到的命令)运行此命令,命令提示符成功执行命令并打印相关行。我希望在 Python 中恢复这些行以检查完成的操作等。这就是我的问题所在。

我尝试了类似 "result = os.system('[message]')" 的方法,但这不起作用(它给出了 'result = 3' 其中 3 绝对不是命令提示符中的输出)。

我曾尝试寻找解决方案,并遇到了许多关于“子流程”的建议(例如 here)。但是,这些似乎不起作用(或者至少我没有让它们起作用),并且是使用诸如使用 'Popen' 和 'communicate()' 之类的技术来尝试获取输出和错误导致获取两者都“无”。可能是我做错了什么。

任何帮助将不胜感激,因为我觉得我在绕圈子。另外,如果这已经在某个地方解决了,我深表歉意,我确实尝试通过谷歌找到解决方案,并搜索 stackoverflow,但无法正确执行它们。

如果有人需要任何进一步的信息来提供帮助,我将非常乐意提供帮助。

谢谢。

【问题讨论】:

  • 你可以使用subprocess.check_output
  • 添加你尝试过的子流程代码和错误输出
  • 您可以使用with subprocess.Popen().stdout as output:,然后使用for line in output:,如this answer 中脚本末尾附近所示。

标签: python cmd window output


【解决方案1】:

正如 Cyber​​ 提到的,subprocess.check_output 是一种非常简单的方法:

import subprocess
file = "foo.txt"
text = "'comment'"
output = subprocess.check_output(["BZR", "commit", file, "-m", text])
print(output)

免责声明:此代码仅适用于 Python 2.7+

【讨论】:

  • 感谢您的帮助:我试过了,它似乎不起作用(我使用的是 Python2.7)。一个问题是:BZR 本身似乎是基于 python 的(或至少是类似的),所以当它运行时,如果它遇到错误,它会反馈到 Python 脚本并停止它(因此意味着没有存储“输出”)。至少我是这么解释的。另一个问题是:如果它运行命令没有问题,那么它似乎存储“”(即一个空字符串)。
  • Python 错误被打印到stderr,而不是stdout,因此它为什么在崩溃时不会存储输出。你可以这样做:output = subprocess.check_output(["/bin/sh","BZR commit foo.txt -m 'comment' 2>&1"])。这会将要打印的 stderr 消息重定向到 stdout
  • 其实之前的建议可能行不通,但是你感兴趣的信息很可能在stderr而不是stdout。此外,您应该将调用放在try:except 块中,以便失败的子进程不会使您的顶级程序崩溃。
  • 感谢您的回复。我试了一下,但有几行错误代码以以下结尾:“WindowsError:[错误 2] 系统找不到指定的文件”我可以确认提交的文件不是问题(就被发现)。编辑(在您添加另一个回复时正在尝试!):这很公平。是的,我使用了一个 try:except 块,老实说,这可能对我想要实现的目标起作用。但我只是想尝试获得输出,以防将来我想做类似但不同的事情。
  • 如果您使用的是 Windows,那么 /bin/sh 将不存在,因为它是一个 Unix-shell 类型的程序(除非您使用的是 cygwin,也就是说...)您可以尝试将cmd 的路径,因为您在 Windows 上并尝试一下。或者您可以让您的 python 程序生成一个批处理脚本,将输出写入文件等。我唯一的建议是让subprocess.check_output 使用一些简单的东西(如批处理脚本、python 程序、cmd 等)和然后,一旦你弄清楚了简单的情况,就将其应用于更复杂的情况。
【解决方案2】:

我使用 git 为我的 python 程序做类似的事情来获取版本信息。 希望它也适用于您的版本控制。 工作示例:

from subprocess import Popen, PIPE

p1 = Popen(['git', 'log' , '-n', '1'], stdout=PIPE, shell=False)
msgout = p1.communicate()[0]  
#msgerr = p1.communicate()[1]  # this captures stderr info but you have to rerun p1
print msgout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-21
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多