2012-12-29 26 views
33

我已经找到关于subprocess.check_output()的文档,但是我找不到一个带参数的文档,文档也不是很深入。我使用Python 3(但我想通过Python 3中运行一个Python 2文件)如何在Python中使用subprocess.check_output()?

我试图运行这个命令: 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'])

+1

当他们不工作时究竟发生了什么? – khagler

+1

试图通过Python 3运行Python 2文件?不,不会发生。 Python 3有意不与Python 2向后兼容。您必须为* starters *运行'2to3'来让您的文件在Python 3中运行。 – Makoto

+1

@Makoto:他正在尝试从Python 2中运行Python 2解释器Python 3脚本,这是完全合理的。 (从他之前的问题中,碰巧知道他是专门做这个解决方案来解决你正在考虑的问题,但在这里并不相关。) – abarnert

回答

45

正确的答案是:

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一个位置参数,但一个可选的参数。否则,句子的后半部分是没有意义的。

+0

现在我用argparse中的2个参数进行了尝试。我试图把这个命令放到子进程中:'python py2.py -i test.txt -l ong'我根据你的回答尝试了这个子进程:'py2output = subprocess.check_output([“python”,“py2.py”, “-i”,“test.txt”,“ - l”,“ong”])'但它不起作用。 –

+1

@ user1925847:你的意思是“它不工作”?这不是一个有用的评论。如果你做得对,它就会起作用 - 正如我的答案所表明的那样。很明显,你做错了什么。但是猜测是不可能的。正如我在对主要问题的评论中所说的:向我们展示您的脚本,并告诉我们预期的和实际的输出是什么,或者没有希望猜测您做错了什么。 – abarnert

+1

,并且不要忘记捕获CalledProcessError **和** OSError异常。 –

2

添加到由@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" 

标准错误= subprocess.STDOUT为确保你不要让filenotfound错误在stderr-哪些不能通常被捕获filenotfoundexception,否则你会最终得到

python: can't open file 'py2.py': [Errno 2] No such file or directory 

Infact更好的解决方案可能是检查文件/脚本是否存在,然后运行文件/脚本

相关问题