Python-subprocess, Anruf(), check_call und returncode zu finden, wenn ein Befehl vorhanden ist
Ich habe herausgefunden, wie man mithilfe von call() auf, um mein python-Skript, um einen Befehl auszuführen:
import subprocess
mycommandline = ['lumberjack', '-sleep all night', '-work all day']
subprocess.call(mycommandline)
Funktioniert es, aber es gibt ein problem, was wenn Benutzer nicht über die Holzfäller in Ihr Befehl Pfad? Es würde funktionieren, wenn der waldarbeiter wurde in dem gleichen Verzeichnis wie das python-Skript, aber wie sieht das script weiß, es sollte für Holzfäller? Ich dachte, wenn es war ein Befehl-nicht-gefunden-Fehler dann Holzfäller wäre nicht im Befehl Weg, das Skript könnte versuchen, herauszufinden, was seinem Verzeichnis und suchen für Holzfäller gibt und schließlich warnen Sie die Benutzer zu kopieren Holzfäller in einen dieser zwei Orte, wenn es nicht gefunden werden. Wie finde ich heraus, was ist die Fehlermeldung? Ich habe gelesen, dass check_call() kann eine Fehlermeldung zurückgeben, und etwas über einen returncode Attribut. Ich konnte nicht finden Sie Beispiele zur Verwendung von check_call() und returncode, was die Nachricht sein würde, oder wie ich sagen könnte, wenn die Meldung Befehl nicht gefunden.
Bin ich noch über das der richtige Weg?
InformationsquelleAutor der Frage Dave Brunker | 2012-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem einfachen snippet:
InformationsquelleAutor der Antwort Theodros Zelleke
subprocess
wird eine Ausnahme ausgelöst,OSError
wenn ein Befehl nicht gefunden.Wenn der Befehl gefunden ist, und
subprocess
läuft der Befehl für Sie, den Ergebnis-code wird zurückgegeben, die von der Befehl. Der standard ist, dass der code 0 bedeutet Erfolg und jeder Misserfolg ist, einige nicht-null-Fehler-Codes (die variiert; überprüfen Sie die Dokumentation für den jeweiligen Befehl, den Sie ausgeführt werden).So, wenn Sie fangen
OSError
Sie behandeln können, die nicht existent Befehl ein, und überprüfen Sie das Ergebnis-code können Sie herausfinden, ob der Befehl erfolgreich war oder nicht.Die große Sache über
subprocess
ist, dass Sie es machen können, sammeln Sie alle den text vonstdout
undstderr
und Sie können Sie dann verwerfen oder zurück oder melden Sie es oder zeigen Sie es wie Sie möchten. Ich benutze oft einen wrapper, der verwirft alle Ausgaben von einem Befehl, wenn der Befehl fehlschlägt, in welchem Fall der text vonstderr
ausgegeben.Ich bin damit einverstanden, dass Sie sollten nicht Fragen, die Benutzer zu kopieren, ausführbare Dateien um. Programme sollten in einem Verzeichnis aufgeführt, in der
PATH
Variablen; wenn ein Programm fehlt, er installiert werden soll, oder wenn es in einem Verzeichnis installiert ist, nicht auf diePATH
sollte der Benutzer aktualisieren, diePATH
das Verzeichnis.Beachten Sie, dass Sie die option haben, zu versuchen
subprocess
mehrere Male mit verschiedenen hard-codierte Pfade zu ausführbaren Dateien:EDIT: zu denken, Nachdem es ein bisschen, habe ich beschlossen komplett neu schreiben die oben. Es ist viel sauberer übergeben Sie einfach eine Liste der Standorte, und eine Schleife versuchen, die alternative Standorte, bis einer funktioniert. Aber ich wollte Sie nicht erstellen Sie die Zeichenfolge für den Benutzer home-Verzeichnis, wenn es nicht benötigt wird, also hab ich einfach gemacht, es legal zu legen, aufrufbar in der Liste der alternativen. Wenn Sie Fragen dazu haben, einfach stellen.
InformationsquelleAutor der Antwort steveha
Wow, das war schnell! Ich kombinierte Theodros Zelleke einfachen Beispiel und steveha die Verwendung von Funktionen mit abarnert Kommentar zu OSError und Lattyware Kommentar über das verschieben von Dateien:
Getestet habe ich es auf Mac OS-X (6.8/Snow Leopard), Debian (Squeeze) und Windows (7). Es schien zu funktionieren, wie ich wollte, dass es auf allen drei Betriebssystemen. Ich habe versucht, mit check_call und CalledProcessError aber egal, was ich Tat, schien ich erhalte eine Fehlermeldung jedes mal, und ich konnte nicht Holen Sie sich das Skript zum Bearbeiten der Fehler. Um das Skript zu testen ich änderte den Namen von 'Holzfäller' , 'deadparrot', da hatte ich ein Holzfäller in das Verzeichnis mit meinem Skript.
Sehen Sie irgendwelche Probleme mit diesem Skript die Art, wie es geschrieben wird?
InformationsquelleAutor der Antwort Dave Brunker