我試圖讓subprocess.Popen()
正常工作,但由於某種原因返回的值是完全錯誤的。如何讓subprocess.Popen正常工作?
該腳本將打開一個FTP連接腳本,用於從服務器下載文件,然後返回成功和未成功下載文件的元組。此腳本在使用subprocess.call()
之前已工作,但我想使用Popen()
,以便它所調用的腳本位於另一個線程中,並且不會干擾主程序。
這裏是我的主類:
def FTPDownload(self):
try:
ftpReq = subprocess.Popen(['Python', mw._['cwd']+"dwnldMedia.py"],
shell=True,
stdout=subprocess.PIPE)
successful, unsuccessful = ftpReq.communicate()
self.consPrompt("Successful:\t"+str(successful))
self.consPrompt("Unsuccessful:\t"+str(unsuccessful))
except subprocess.CalledProcessError as e:
self.consPrompt((cp._['E0']).format(str(e)))
,這裏是dwnldMedia.py
(__init__
電話download()
):
def download(self):
#print("connected")
self.server = FTP(**self.serverDetails)
self.server.login(**self.userDetails)
self.server.cwd("/public_html/uploads") #changing to /pub/unix
#print "File List: \n"
files = []
successful = [0]
unsuccessful = [0]
self.server.retrlines("NLST",files.append)
for f in files:
if(f != '.' and f != '..'):
#print("downloading:\t"+f)
local_filename = os.path.join(mw._['cwd']+"media", f)
with open(local_filename, "wb") as i:
self.server.retrbinary("RETR " + f, i.write)
#print("\t| Success")
successful.append(f)
for f in files:
if(f != '.' and f != '..' and f not in successful):
unsuccessful.append(f)
return (successful, unsuccessful)
我得到的輸出是:
Successful:
Unsuccessful: None
凡successful
有值爲None
。
['Popen.communicate()'](https://docs.python.org/2/庫/ subprocess.html#subprocess.Popen。溝通)從過程返回'stdout'和'stderr'的內容 - 而不是你的'download()'方法_returns_。換句話說,你需要將'成功'和'不成功'的值寫入'sys.stdout'。這樣做的一種方法是簡單地將它們打印出來。 – martineau
如果你期望任何數據通過錯誤流,我建議你添加一個'stderr = subprocess.PIPE'。 –
@馬蒂諾,請張貼您的答案作爲答案。 –