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

JOH*_*ÅTT 60 python python-2.x python-3.x

我找到了有关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'])

aba*_*ert 65

正确答案(使用Python 2.7及更高版本,因为check_output() 之后推出)是:

py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt'])
Run Code Online (Sandbox Code Playgroud)

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

py2.py:

import sys
print sys.argv
Run Code Online (Sandbox Code Playgroud)

py3.py:

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

运行它:

$ python3 py3.py
py2 said: b"['py2.py', '-i', 'test.txt']\n"
Run Code Online (Sandbox Code Playgroud)

这是你的每个版本的错误:

py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])
Run Code Online (Sandbox Code Playgroud)

首先,str('python py2.py')与你'python py2.py'正在采取一个完全相同的东西str,并呼吁str将其转换为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'
Run Code Online (Sandbox Code Playgroud)

"echo"用一个额外的参数调用命令,"Hello World!".

也:

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

我敢肯定-i不是一个位置参数,但一个可选的参数.否则,句子的后半部分没有意义.

  • @ user1925847:"它不起作用"是什么意思?这不是一个有用的评论.如果你做得对,它就有效 - 正如我的答案所示.显然你做错了什么.但是无法猜出是什么.正如我在主要问题的评论中所说:向我们展示你的脚本,并告诉我们预期和实际输出是什么,或者没有希望猜测你做错了什么. (2认同)

rav*_*bie 9

添加到@abarnert提到的内容

更好的是捕捉异常

import subprocess
try:
    py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'],stderr= subprocess.STDOUT)  
    #print('py2 said:', py2output)
    print "here"
except subprocess.CalledProcessError as e:
    print "Calledprocerr"
Run Code Online (Sandbox Code Playgroud)

这个stderr = subprocess.STDOUT是为了确保您不会在stderr中收到filenotfound错误-通常无法在filenotfoundexception中捕获该错误,否则您最终会得到

python: can't open file 'py2.py': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

实际上,更好的解决方案可能是检查文件/脚本是否存在,然后运行文件/脚本


Goh*_*ohu 6

因为Python 3.5,subprocess.run()建议在subprocess.check_output()

>>> subprocess.run(['cat','/tmp/text.txt'], stdout=subprocess.PIPE).stdout
b'First line\nSecond line\n'
Run Code Online (Sandbox Code Playgroud)

从Python 3.7开始,您可以使用capture_output=true参数来捕获stdout和stderr 而不是上面的代码:

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

另外,您可能要使用universal_newlines=TruePython 3.7或更高版本的text=True文本,而不是二进制文件:

>>> stdout = subprocess.run(['cat', '/tmp/text.txt'], capture_output=True, text=True).stdout
>>> print(stdout)
First line
Second line
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见subprocess.run()文档。