正確的答案是:
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