2014-02-25 65 views
0

我使用Windows和struggeling得到這個工作的一個.exe文件...運行帶有附加參數

我可以在cmd.exe的執行此:

"C:\Program Files (x86)\Test 123\Test.exe" "H:\Test Test\file.txt" -f "doStuff" 

,但是當我嘗試做它在python:

subprocess.call([r'"C:\Program Files (x86)\Test 123\Test.exe" "H:\Test Test\file.txt" -f "doStuff"']) 

我得到這個錯誤:

Traceback (most recent call last): 
    File "testing12.py", line 20, in <module> 
    subprocess.call([r'"C:\Program Files (x86)\Test 123\Test\Test.exe" "H:\Test Test\Folder\file.txt" -f "doStuff"']) 
    File "c:\Python27\lib\subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "c:\Python27\lib\subprocess.py", line 709, in __init__ 
    errread, errwrite) 
    File "c:\Python27\lib\subprocess.py", line 957, in _execute_child 
    startupinfo) 
WindowsError: [Error 5] Access is denied 

如何正確執行它?謝謝。

+1

我相信你需要'''subprocess.call()''''''shell = True'''。但請注意,這會在使用未經消毒的輸入時產生潛在的安全風險 – wnnmaw

+1

shell = True是錯誤的答案。把它作爲一個真正的清單,而不是一個單一的清單是正確的。 –

+0

@CharlesDuffy聖潔的廢話我甚至沒有看到那個單引號。接得好!! –

回答

4

如果你打算傳入一個數組,那麼將它作爲一個實際的數組 - 每個參數一個參數,用逗號分隔。否則,您需要使用shell=True,它具有調用shell的所有(通常不受歡迎的)副作用(並且應該只是將字符串作爲字符串傳入,而不是在該用例中調用的數組)。

subprocess.call([ 
    "C:\Program Files (x86)\Test 123\Test.exe", 
    "H:\Test Test\file.txt", 
    "-f", "doStuff"]) 

如果您在字符串之間不使用逗號,則它們會合並在一起。

+0

謝謝,但這不完全正確。 'doStuff'需要是''doStuff''。我試圖將它與-f連接起來,所以我得到了''-sf「doStuff」'',這不起作用。 – Johnny

+1

@Johnny:你有沒有試過答案,或者你猜這是不正確的?你的'cmd.exe'例子中的引號由'cmd'本身解釋,永遠不會到達'Test.exe',而在Python情況下,你根本不會調用'cmd.exe'。 – lanzz

+0

@Johnny,我支持我的回答,因爲lanzz給出的理由 - 傳遞數組的**整點**是讓你的Python代碼提前進行分離 - 而不是需要shell是一個可以自行拆分的參數字符串。如果您認爲這是不正確的,請提供一個證明它不正確的測試,我們可以在沒有這些嚴格假設的程序的情況下運行自己。 –