正确的答案(使用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'])
首先,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'
这会调用"echo"
带有附加参数的命令"Hello World!"
。
也:
-i是argparse的位置参数,test.txt是-i是
我敢肯定-i
是不是一个位置参数,但一个可选的参数。否则,句子的后半部分是没有意义的。