2012-12-29 90 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更好的解決方案可能是檢查文件/腳本是否存在,然後運行文件/腳本

相關問題