Ich habe gerade angefangen, an Python zu arbeiten, und ich habe versucht, eine externe ausführbare Datei von Python aus auszuführen.
Ich habe eine ausführbare Datei für ein in Fortran geschriebenes Programm. Angenommen, der Name für die ausführbare Datei lautet flow.exe. Und meine ausführbare Datei befindet sich in C:\Documents and Settings\flow_model
. Ich habe sowohl os.system- als auch popen-Befehle ausprobiert, aber bisher konnte ich es nicht zum Laufen bringen. Der folgende Code scheint das Befehlsfenster zu öffnen, würde das Modell jedoch nicht ausführen.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
Wie kann ich das beheben?
python
executable
Mesut
quelle
quelle
Antworten:
Diese Leerzeichen können wirklich störend sein :-(. Versuchen Sie,
os.chdir('C:/Documents\ and\ Settings/')
relativen Pfaden füros.system
,subprocess
Methoden oder was auch immer zu folgen ...Wenn Best-Effort-Versuche, die Hürde der Leerzeichen im Pfad zu umgehen, weiterhin fehlschlagen, ist mein nächster bester Vorschlag , Leerzeichen in Ihren entscheidenden Pfaden zu vermeiden . Könnten Sie nicht machen einen Rohlingen losen Verzeichnis, kopieren Sie die entscheidenden
.exe
dort Datei, und versuchen Sie das ? Sind diese zerstörerischen Räume für Ihr Wohlbefinden absolut notwendig ...?quelle
subprocess.Popen
Ihre gewünschten Werte dort weiterleiten. Wenn es tiefer geht (unter Verwendung der "Konsoleneingabe"), versuchen Sie es mit wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
ist es die wahrscheinlichste Lösung, nichts darüber zu wissen, wie diese Exe codiert ist, da Sie damit genau simulieren können, was diese Exe-Datei sehen würde, wenn sie in einem Cmd-Fenster aufgerufen wird.Wenn Sie Python 2.7 oder höher verwenden (insbesondere vor Python 3.5), können Sie Folgendes verwenden:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Führt den durch args beschriebenen Befehl aus. Wartet auf den Abschluss des Befehls und gibt dann das returncode-Attribut zurück.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Führt einen Befehl mit Argumenten aus. Wartet, bis der Befehl abgeschlossen ist. Wenn der Rückkehrcode Null war, wird zurückgegeben, andernfalls wird CalledProcessError ausgelöst. Das CalledProcessError-Objekt hat den Rückkehrcode im returncode-AttributBeispiel:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
Hier ist der Link zur Dokumentation: http://docs.python.org/3.2/library/subprocess.html
Für Python 3.5+ können Sie jetzt in vielen Fällen run () verwenden: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
quelle
Der einfachste Weg ist:
Es klappt; Ich versuchte es.
quelle
module 'os' has no attribute 'startfile'
. (Mit Python3.6)Ich würde versuchen, ein 'r' vor Ihren Pfad einzufügen, wenn ich Sie wäre, um anzuzeigen, dass es sich um eine rohe Zeichenfolge handelt - und dann müssen Sie keine Schrägstriche verwenden. Beispielsweise:
quelle
Ihre Verwendung ist korrekt. Ich wette, dass Ihr externes Programm flow.exe in seinem Verzeichnis ausgeführt werden muss, da es auf einige dort gespeicherte externe Dateien zugreift.
Sie könnten also versuchen:
(Achten Sie auf die doppelten Anführungszeichen in den einfachen Anführungszeichen ...)
quelle
Verwenden Sie einen Unterprozess , es ist ein kleineres Modul, damit es
.exe
schneller läuft .quelle
.exe
schneller?Mit os.system :
quelle
Versuchen
quelle
Wenn ich es wäre, würde ich die EXE-Datei in das Stammverzeichnis (C :) legen und sehen, ob es so funktioniert. Wenn ja, sind es wahrscheinlich die (bereits erwähnten) Leerzeichen im Verzeichnisnamen. Wenn nicht, können es einige Umgebungsvariablen sein.
Versuchen Sie auch, Ihren stderr zu überprüfen (unter Verwendung einer früheren Antwort von int3):
Der Code ist möglicherweise nicht ganz korrekt, da ich normalerweise weder Popen noch Windows verwende, sollte aber die Idee geben. Es kann durchaus sein, dass sich die Fehlermeldung im Fehlerstrom befindet.
quelle
quelle
Verwenden Sie in Python 2.6 eine Zeichenfolge, die in Anführungszeichen und Apostroph eingeschlossen ist. Ändern Sie auch single / to double //. Ihr Arbeitsbeispiel sieht folgendermaßen aus:
Sie können auch beliebige Parameter verwenden, wenn Ihr Programm sie aufnimmt.
Schließlich können Sie die Zeichenfolgenvariable verwenden. Ein Beispiel ist das Plotten mit Gnuplot direkt aus Python:
quelle
Versucht das,
C:\Documents
mit Argumenten von auszuführen"and", "Settings/flow_model/flow.exe"
?Auch könnten Sie in Betracht ziehen
subprocess.call()
.quelle
Das ist die richtige Verwendung, aber vielleicht bringen die Leerzeichen im Pfadnamen die Dinge aus irgendeinem Grund durcheinander.
Möglicherweise möchten Sie das Programm auch unter cmd.exe ausführen, damit Sie alle Ausgaben von flow.exe sehen können, die möglicherweise auf einen Fehler hinweisen.
quelle
Es gibt viele verschiedene Lösungen, und die Ergebnisse hängen stark ab von:
Da ich einige Dinge entdeckt habe, von denen behauptet wird, dass sie nur unter Windows funktionieren, ist dies wahrscheinlich nicht der Fall, weil ich zufällig Cygwin verwende, das die Art und Weise des Betriebssystems überlistet, mit Windows-Pfaden umzugehen. Andere Dinge funktionieren nur in reinen * nix-basierten Betriebssystemen oder in Python2 oder 3.
Hier sind meine Ergebnisse:
os.system()
ist die Methode am verzeihendsten.os.startfile()
ist am wenigsten verzeihend. (Nur Windows && wenn Sie Glück haben)subprocess.Popen([...])
nicht empfohlensubprocess.run(winView, shell=True)
der empfohlene Weg!subprocess
für alles ein Sicherheitsrisiko darstellen kann .Probiere diese:
F: Warum sollten Sie verwenden möchten
explorer
Windows verwenden?A: Wenn Sie nur die Ergebnisse einer neuen Datei anzeigen möchten, öffnet der Explorer die Datei automatisch mit dem Standard-Windows-Programm, das Sie für diesen Dateityp festgelegt haben. Sie müssen das zu verwendende Standardprogramm also nicht erneut angeben.
quelle
Für die obige Frage funktioniert diese Lösung.
Ändern Sie einfach den Pfad zu dem Ort, an dem sich Ihre ausführbare Datei befindet.
Hier ist test1.pdf rootimage für meinen Code.
quelle
"
inos.system
?