2017-03-28 75 views
0

我有一個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

回答

1

嗯,顯然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. 

閱讀一些進一步的解釋代碼中的註釋..

+0

其實有代碼錯誤和'等待()'被稱爲另一個var比'self.task',就像錯誤說的那樣。我接受你的答案,因爲我從中學到了2-3件事,謝謝 –