我有一個Python代碼段是這樣的:蟒子POPEN返回None
self.task = subprocess.Popen("bash ./FOLDER/script.sh", cwd=some_dir, shell=True)
self.task.wait()
從其中將引發一個例外,抱怨一個「NoneType」對象沒有方法等待()。我想這意味着Popen調用返回None?這可能是什麼原因。該文件沒有提到這種可能性
我使用python 2.7.13
我有一個Python代碼段是這樣的:蟒子POPEN返回None
self.task = subprocess.Popen("bash ./FOLDER/script.sh", cwd=some_dir, shell=True)
self.task.wait()
從其中將引發一個例外,抱怨一個「NoneType」對象沒有方法等待()。我想這意味着Popen調用返回None?這可能是什麼原因。該文件沒有提到這種可能性
我使用python 2.7.13
嗯,顯然self.task給人以NoneType respons意味着subprocess.Popen()
的命令可能會出現故障。
我注意到的第一件事是一個不正確的語法,因爲你沒有用方括號[]
包裝你的命令行,你沒有分割參數。
此外,Python文檔狀態(關於你使用的CWD選項):
如果CWD不是無,孩子的當前目錄會在執行之前把它改成 CWD。請注意,在搜索可執行文件時,此目錄不被視爲 ,因此您無法指定相對於cwd的程序路徑 。
所以首先要檢查的是,如果您的script.sh
位於some_dir/FOLDER/script.sh
。
如果確實如此,請檢查是否用正確的語法插入了cwd參數,如字符串。含義cwd="/path/to/some/dir"
。
然後,由於Python文檔明確指出:
使用shell =真可以是一個安全隱患
我會刪除這樣的說法。這可能意味着你將不得不使用你的bash的完整路徑。要找出正確的路徑,請打開一個終端並執行which bash
。或者,可以肯定的是,type bash
。
然後,試試這個:
import subprocess
self.task = subprocess.Popen(["/path/to/your/bash", "./FOLDER/script.sh"], cwd="/path/to/some_dir", stdout=subprocess.PIPE, stderr=subprocess.PIPE) # This makes sure you will also catch any standard errors, so it allows for a bit more control.
output, errors = self.task.communicate() # This already encapsulates .wait()
print(output.decode()) # if you'd like to check the output.
閱讀一些進一步的解釋代碼中的註釋..
其實有代碼錯誤和'等待()'被稱爲另一個var比'self.task',就像錯誤說的那樣。我接受你的答案,因爲我從中學到了2-3件事,謝謝 –