我试图让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'。 –
@马蒂诺,请张贴您的答案作为答案。 –