正确的答案是:
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'
-you're采取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'
与一个额外的参数,"Hello World!"
调用"echo"
命令。
另外:
-i为argparse,测试位置参数。TXT是-i是什么
我敢肯定-i
是不一个位置参数,但一个可选的参数。否则,句子的后半部分是没有意义的。
当他们不工作时究竟发生了什么? – khagler
试图通过Python 3运行Python 2文件?不,不会发生。 Python 3有意不与Python 2向后兼容。您必须为* starters *运行'2to3'来让您的文件在Python 3中运行。 – Makoto
@Makoto:他正在尝试从Python 2中运行Python 2解释器Python 3脚本,这是完全合理的。 (从他之前的问题中,碰巧知道他是专门做这个解决方案来解决你正在考虑的问题,但在这里并不相关。) – abarnert