【发布时间】:2016-04-11 00:38:58
【问题描述】:
我正在尝试让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()从进程中返回stdout和stderr的内容——而不是你的download()方法返回。换句话说,您需要将successful和unsuccessful的值写入 到sys.stdout。一种方法是简单地print他们出去。 -
如果您希望有任何数据通过错误流,我建议您添加
stderr=subprocess.PIPE。 -
@martineau,请将您的答案作为答案发布。
-
它不是“另一个线程”,它是一个子进程。
-
哦..我以为这就像打开一个新线程。你可以使用什么库来打开一个新线程?
标签: python python-2.7 subprocess popen