2016-10-06 69 views
2

在experiment_script.py中,我使用一個列表作爲subprocess.Popen()的輸入。 。在Python 3.5中,當使用參數列表作爲subprocess.Popen()的輸入時,我無法得到正確的len(sys.argv)

cmd = [r'.\modified_easy.py', training_libsvm_files[training_index], testing_libsvm_files[training_index]] 
p = subprocess.Popen(cmd, 
        shell = True, # The cmd won't work without this setting in Python 3.3. However, in Python 3.5, this setting is not necessary. 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

在\ modified_easy.py,參數的數目被檢查:

if len(sys.argv) <= 1: 
    print('Usage: {0} training_file [testing_file]'.format(sys.argv[0])) 
    raise SystemExit 

experiment_script.py運行正常在Python3.3。但是,在我更改爲Python 3.5之後。檢查len(sys.argv)失敗,並且引發SystemExit。我打印出len(sys.argv),發現它現在變成1.那麼,這是怎麼發生的以及如何得到正確的len(sys.argv)

我的操作系統是Windows 64位。

即使我使用cmd = ' '.join(cmd)將序列更改爲字符串,然後將其輸入到subprocess.Popen()len(sys.argv)的結果仍爲1。

+0

我困惑使操作系統開放源.py文件。我在2臺計算機上安裝了2個Python 3.3.2。 experiment_script.py在一臺計算機上工作,但在另一臺計算機上失敗。 –

+0

嘗試在'cmd'的開頭添加''python'',例如'cmd = ['python','。\ modified_easy.py',...]'。 – acw1668

+0

@ acw1668我加了''python'',最後'len(sys.argv)'變成了3.非常感謝。但是,原因是什麼?由於當我調用沒有'python'關鍵字的python腳本時,有很多地方。還有其他更簡單的解決方案嗎? –

回答

2

感謝@eryksun和@ J.F。塞巴斯蒂安。我做了一些試驗,發現len(sys.argv)無法按預期工作。

就像什麼@eryksun說,

選擇「巨蟒」,從列表(py啓動圖標有火箭的話)和「總是」使用這個應用程序。不要「查找另一個應用程序」,因爲選擇一個可執行文件會直接創建一個不接受命令行參數的新ProgId。

當使用subprocess,如果不指定python關鍵字或sys.executable運行另一種語言的Python腳本,操作系統會根據一些文件關聯打開.py文件。如果操作系統默認使用python啓動器py.exe打開.py文件,那麼就可以。如果操作系統打開.py文件與python.exe然後len(sys.argv)將失敗。

以前,我在計算機中安裝了Anaconda,並且沒有安裝py.exe。所以,當通過「open with」對話框詢問時,我選擇了python.exe。因此len(sys.argv)失敗。

爲了解決這個問題,我可以添加python關鍵字或使用py.exe

相關問題