正确的答案是(使用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
。这会使代码更难以阅读、更冗长、甚至更慢,而且并没有增加任何好处。
更重要的是,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'
这调用了带有附加参数"Hello World!"
的"echo"命令。
另外:
-i是argparse的位置参数,test.txt是-i所代表的内容。
我确信-i
不是一个位置参数,而是一个可选参数。否则,句子的后半部分就没有意义了。
2to3
才能让你的文件在Python 3中工作。 - Makotopy2.py
如何解释参数的期望,与问题无关。这让至少一个人(Makoto)感到困惑,他本来可能会给你一个好的答案,也可能会让其他人感到困惑或害怕。在将来,如果您能提供一个最小的示例,并消除所有不必要的干扰,您可能会得到更好的答案。 - abarnertsubprocess
测试 Python 程序时,我倾向于使用 Unix 内置的yes
命令,因为它非常轻量级,可以生成包含单个字符“y”的无限行数。 - Tom Swirly