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是不是一个位置参数,但一个可选的参数.否则,句子的后半部分没有意义.
添加到@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)
实际上,更好的解决方案可能是检查文件/脚本是否存在,然后运行文件/脚本
因为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()文档。
| 归档时间: |
|
| 查看次数: |
156688 次 |
| 最近记录: |