你如何在 Python 中使用 subprocess.check_output()?

新手上路,请多包涵

我找到了有关 subprocess.check_output() 的文档,但找不到带有参数的文档,而且文档不是很深入。我正在使用 Python 3(但我正在尝试通过 Python 3 运行 Python 2 文件)

我正在尝试运行此命令: python py2.py -i test.txt

-i 是 argparse 的位置参数,test.txt 是 -i 是什么,py2.py 是要运行的文件

我尝试了很多(非工作)变体,包括: py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])

原文由 JOHANNES_NYÅTT 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 709
2 个回答

正确答案(使用 Python 2.7 及更高版本,因为 当时引入了 check_output() )是:

 py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt'])

为了演示,这是我的两个程序:

py2.py:

 import sys
print sys.argv

py3.py:

 import subprocess
py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'])
print('py2 said:', py2output)

运行它:

 $ python3 py3.py
py2 said: b"['py2.py', '-i', 'test.txt']\n"

以下是您的每个版本的问题:

 py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

First, str('python py2.py') is exactly the same thing as 'python py2.py' taking a str , and calling str to convert it to an str 。这使得代码更难阅读、更长,甚至更慢,而没有增加任何好处。

更严重的是, python py2.py 不能是单个参数,除非您实际上正在尝试运行名为 /usr/bin/python\ py2.py 的程序。你不是;你正在尝试运行 /usr/bin/python 第一个参数 py2.py 。因此,您需要使它们成为列表中的独立元素。

您的第二个版本修复了该问题,但您在 ' 之前缺少 test.txt' 。这应该给你一个 SyntaxError ,可能是说 EOL while scanning string literal

同时,我不确定您是如何找到文档的,但找不到任何带参数的示例。第一个例子是:

 >>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'

这会调用带有附加参数 "echo" 命令 "Hello World!"

还:

-i 是 argparse 的位置参数,test.txt 是 -i 的内容

我很确定 -i 不是 位置参数,而是可选参数。否则,后半句就没有意义了。

原文由 abarnert 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Python 3.5 开始, 建议使用 subprocess.run 而不是 subprocess.check_output

 >>> subprocess.run(['cat','/tmp/text.txt'], check=True, stdout=subprocess.PIPE).stdout
b'First line\nSecond line\n'

从 Python 3.7 开始,您可以使用 capture_output=true 参数来捕获 stdout 和 stderr:

 >>> subprocess.run(['cat','/tmp/text.txt'], check=True, capture_output=True).stdout
b'First line\nSecond line\n'

此外,您可能希望使用 universal_newlines=True 或自 Python 3.7 以来的等效 text=True 来处理文本而不是二进制文件:

 >>> stdout = subprocess.run(['cat', '/tmp/text.txt'], check=True, capture_output=True, text=True).stdout
>>> print(stdout)
First line
Second line

原文由 Gohu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题