2017-09-26 267 views
1

我有一個功能,我需要在python腳本中運行一個命令。從另一個答案,我想call from subprocess module是最安全的方式。但是,我無法完成它。我使用Python 2.7從python腳本運行subprocess.call

這是我想做一個較小的版本:

import subprocess 
a = "echo hello" 
subprocess.call([a]) 

它給了我下面的錯誤:

subprocess.call([a]) 
    File "/usr/lib/python2.7/subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

我無法找出原因!

回答

1

您可以通過命令爲列表但不是在列表的字符串,否則系統試圖運行echo hello過程(不存在,很明顯,這解釋了OSError: [Errno 2] No such file or directory錯誤消息)。將它作爲字符串傳遞需要某些系統上的shell=True

而且shell=True還需要與像echo命令shell內置(它有內置的版本/bin在某些系統上不可,只是爲了增加混亂)

import subprocess 
subprocess.call(["echo","hello"],shell=True) 

對於非內置-in命令(我假設echo在這裏只是一個測試),避免shell=True,因爲它增加了,這降低啓動性能不必要的殼層,且容易出現代碼注入(echo hello; rm -rf everything_on_disk)

要運行你喜歡的編輯器,例如,你可以做:

subprocess.call(["emacs","readme.txt"]) 
+0

嗨,只是一個後續問題:我想寫一個字符串src到一個文件。那麼,我應該怎麼做呢? callFile =「nameInput」 c1 = [「echo」,src,「>>」,inputFile] call(c1,shell = True) – Tarun

+0

後續問題在這裏不是真正的主題,而是檢查這一個它完美的答案:https://stackoverflow.com/questions/4965159/python-how-to-redirect-output-with-subprocess –

+0

雅,只是想確定,如果我理解是正確的。謝謝:) – Tarun

1

你寫的代碼有問題,subprocess.call需要列表中的第一個元素是命令。在你的情況下,它是echohello是你的論據,它應該是列表中的下一個值。所以你的代碼應該看起來像這樣。

import subprocess 

a = [ "echo","hello"] 
subprocess.call(a)