正确的答案(使用 Python 2.7 及更高版本,因为check_output() 是 then 引入的)是:
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'正在接受 astr并调用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位置参数,而是可选参数。否则,句子的后半部分毫无意义。