Ich versuche, subprocess.Popen()
korrekt zu funktionieren, aber aus irgendeinem Grund ist der zurückgegebene Wert vollständig falsch.Wie subprocess.Popen richtig funktioniert?
Das Skript öffnet ein FTP-Verbindungsskript, das Dateien von einem Server herunterlädt und dann ein Tupel der erfolgreichen und nicht erfolgreich heruntergeladenen Dateien zurückgibt. Dieses Skript hat vor der Verwendung von subprocess.call()
funktioniert, aber ich möchte Popen()
verwenden, damit das Skript, das es aufruft, in einem anderen Thread ist und das Hauptprogramm nicht beeinträchtigt.
Hier ist meine Hauptklasse:
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)))
und hier ist dwnldMedia.py
(__init__
Anrufe 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)
Der Ausgang ich erhalte, ist:
Successful:
Unsuccessful: None
Wo successful
hat ein Wert von None
.
[ 'Popen.communicate()'] (https://docs.python.org/2/ Bibliothek/Subprozess.html # Subprozess.Popen.kommunizieren) gibt den Inhalt von 'stdout' und' stderr' aus dem Prozess zurück - nicht was Ihre 'download()' Methode _returns_ ist. Mit anderen Worten, Sie müssen _write_ die Werte von 'successful' und' successful' in 'sys.stdout' eingeben. Eine Möglichkeit wäre, sie einfach auszudrucken. – martineau
Ich würde empfehlen, dass Sie eine 'stderr = subprocess.PIPE' hinzufügen, wenn Sie irgendwelche Daten über den Fehler-Stream erwarten. –
@martineau, bitte posten Sie Ihre Antwort als Antwort. –