Teilprozess.check_output versagt mit Fehler 127
Ich versuche zu aufrufen eines externen Programms aus meinem python-Anwendung, aber es zeigt keine Ausgabe und schlägt mit Fehler 127. Die Ausführung des Befehls von der Kommandozeile aus funktioniert einwandfrei. (und ich bin in der richtigen Arbeitsverzeichnis)
def buildContris (self, startUrl, reportArray):
urls = []
for row in reportArray:
try:
url = subprocess.check_output(["casperjs", "casper.js", startUrl, row[0]], shell=True)
print (url)
urls.append(url)
break
except subprocess.CalledProcessError as e:
print ("Error: " + str(e.returncode) + " Output:" + e.output.decode())
return urls
Jedes loop-Ausgänge die folgenden Fehler: (ich habe auch überprüft e.cmd. Es ist richtig, aber lang, also habe ich es weggelassen in diesem Beispiel)
Error: 127 Output:
LÖSUNG:
Der folgende code funktioniert
app = subprocess.Popen(["./casperjs/bin/casperjs", "casper.js", startUrl, row[0]], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env = {"PATH" : "/usr/local/bin/:/usr/bin"}, universal_newlines=True)
app.wait()
out, errs = app.communicate()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, indem Sie den vollständigen Pfad zu casperjs in Ihrem Teilprozess.check_output () - Aufruf.
Edit: Answeing deiner 2. Frage. Ich entschuldige mich für die Formatierung, wie ich bin auf dem iPad.
Ich denke, Sie sollten versuchen Popen statt check_output, so dass Sie können Umgebungsvariablen angeben:
which {program name}
.shell=True
ändert sich die interpretation des ersten Arguments (args
) incheck_output()
nennen, von den docs:Exit-status
127
könnte bedeuten, dass die shell nicht gefunden habecasperjs
Programm odercasperjs
selbst beendet mit code.Fix-code: drop
shell=True
und geben Sie den vollständigen Pfad zu dercasperjs
Programm z.B.:check_call("/usr/bin/env")
ich vermute, Sie sind sich sehr ähnlich, D. H., Ihr problem ist nicht, dass Unterprozess sieht anders$PATH
als Python-Skript. Allerdings können Sieenv
parameter zum festlegen einer benutzerdefinierten Umgebung für den Teilprozess.check_output()
übergibt alle Argumente anPopen()
dass es intern verwendet.Versuche, um explizit den Pfad in dieser Weise.
Wenn Sie die Datei aufrufen, ist in den gleichen Pfad (ändern
__file__
wenn nicht):Wenn Sie erleben diese Art Unsinn auf macOS: nicht verwenden Aliase. Verloren einen halben Tag mit, dass. Also, änderung:
zu