2009-11-28 11 views
53

Ich habe gerade angefangen, an Python zu arbeiten, und ich habe versucht, eine externe ausführbare Form Python auszuführen. Ich habe eine ausführbare Datei für ein Programm in Fortran geschrieben. Sagen wir, der Name für die ausführbare Datei ist flow.exe. Und meine ausführbare Datei befindet sich in C: \ Dokumente und Einstellungen \ flow_model Ich habe versucht os.system und popen Befehle, aber bis jetzt konnte es nicht funktionieren. Der folgende Code scheint das Befehlsfenster zu öffnen, würde aber das Modell nicht ausführen.Ausführen eines externen Programms (ausführbare Datei) in Python?

# Import system modules 
import sys, string, os, arcgisscripting 
os.system("C:/Documents and Settings/flow_model/flow.exe") 

Irgendwelche Vorschläge da draußen? Jede Hilfe würde sehr geschätzt werden.

+1

Mögliche Duplikat [Aufruf eines externen Kommandos in Python] (https://stackoverflow.com/questions/89228/calling-an-external-command-in -python) – mkobit

Antwort

25

Diese Whitespaces können wirklich ein :-(gestört sein. Versuchen Sie os.chdir('C:/Documents\ and\ Settings/') von relativen Pfaden gefolgt os.system, subprocess Methoden, oder was auch immer ...

Wenn best-effort versucht, die Whitespaces-in-Pfad Hürde zu umgehen Fehler zu vermeiden, dann mein nächster bester Vorschlag ist Vermeiden Sie mit Leerzeichen in Ihren entscheidenden Pfaden.Könnten Sie nicht ein Leerzeichen-less-Verzeichnis, kopieren Sie die entscheidende .exe Datei dort, und versuchen Sie , dass sind diese Havoc-Wrack Platz unbedingt notwendig für Ihr Wohlbefinden ...?

+0

Alex, danke. Das hat auch funktioniert. Ich habe noch eine Frage, wenn es Ihnen nichts ausmacht. Wie wäre es, wenn meine ausführbare Datei nach dem Namen meiner Eingabedatei fragt? Ich habe versucht, es mit stdin zu tun, konnte aber bisher nicht erfolgreich sein? – Mesut

+1

@mesut, was ist das für eine ausführbare Datei, um nach dem Dateinamen zu fragen? Wenn es zum Beispiel eine eigene Standardeingabe ist, können Sie 'subprocess.Popen' verwenden, um die gewünschten Werte dorthin zu leiten. Wenn es tiefer geht (mit der Eingabe "Konsole"), versuchen Sie es mit wexpect, http://sage.math.washington.edu/home/goreckc/sage/wexpect/. –

+0

Die Eingabedatei ist eine einfache TXT-Datei im selben Ordner. Der Code öffnet jetzt die exe aus dem cmd-Fenster. Und die ausführbare Datei fragt nach dem Namen der Eingabedatei. Gibt es eine Möglichkeit, dass ich diesen Namen (vielleicht als Pfad) innerhalb des Codes definieren kann? Ich probierte subprocess.popen und ich versuchte, in den Variablen zu suchen. Ich dachte, dass ich stdin verwenden kann, aber nicht wirklich funktioniert. Ich würde wirklich schätzen, wenn Sie mir ein Beispiel mit subprocess.popen mit der ausführbaren Datei in C: \ flow_model, den Namen der ausführbaren Datei als flow.exe und den Namen der Eingabedatei im selben Ordner wie sac_bsl.txt – Mesut

1

Wird versucht, C:\Documents mit Argumenten von "and", "Settings/flow_model/flow.exe" auszuführen?

Auch könnte man bedenkt, subprocess.call()

2

Versuchen

import subprocess 
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"]) 
+0

versuchte es und das gleiche passierte. Es scheint, als ob es das Cmd-Fenster öffnet, aber dann würde es die ausführbare Datei nicht ausführen. Ich habe die ausführbare Datei separat ausprobiert und es funktioniert gut. Ich habe den Ordner auch als C:/flow_model verschoben. Machte keinen Unterschied. – Mesut

0

, dass die richtige Anwendung ist, aber vielleicht die Räume im Pfadnamen sind in Unordnung Dinge aus irgendeinem Grund auf.

Sie können 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.

14

Ich würde versuchen, ein ‚r‘ vor Ihrem Weg eingefügt, wenn ich dir wäre, dass sein Ausgang Zeichenfolge anzuzeigen - und dann werden Sie nicht Schrägstriche verwenden müssen, zum Beispiel:

os.system(r"C:\Documents and Settings\flow_model\flow.exe") 
13

Ihre Verwendung ist korrekt, ich wette, dass Ihr externes Programm, flow.exe, in seinem Verzeichnis ausgeführt werden muss, da es auf einige externe Dateien zugreift, die dort gespeichert sind.

so können Sie versuchen:

import sys, string, os, arcgisscripting 
os.chdir('c:\\documents and settings\\flow_model') 
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"') 

(hüte dich vor den doppelten Anführungszeichen innerhalb der Apostrophe ...)

+1

Adrien, Danke, das hat geklappt. – Mesut

1

Wenn es nach mir ginge, ich die exe in der Wurzel diretcory setzen würde (C :) und sehen, ob es so funktioniert. Wenn ja, sind es wahrscheinlich die (bereits erwähnten) Leerzeichen im Verzeichnisnamen. Wenn nicht, können einige Umgebungsvariablen vorhanden sein.

Versuchen Sie auch, Sie StdErr (mit einer früheren Antwort von INT3) zu überprüfen:

import subprocess 
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \ 
          stderr=subprocess.PIPE) 
if process.stderr: 
    print process.stderr.readlines() 

Der Code nicht ganz korrekt sein könnte, wie ich in der Regel nicht verwenden Popen oder Fenster, sondern die Idee, . Es kann gut sein, dass die Fehlermeldung im Fehler-Stream ist.

13

Der einfachste Weg ist:

import os 
os.startfile("C:\Documents and Settings\flow_model\flow.exe") 

Es funktioniert, ich habe es versucht.

32

Bei der Verwendung von Python 2.7 oder höher (insbesondere vor Python 3.5) Sie Folgendes verwenden:

import subprocess 
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Führt den von args beschrieben Befehl. 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 auf den Abschluss des Befehls. Wenn der Rückgabecode Null war, wird zurückgegeben, andernfalls wird CalledProcessError ausgelöst. Das CalledProcessError Objekt wird der Code Rückkehr in der Rückkehr

Beispiel Attribute: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"]) EDIT:

In regelmäßigen Python-Strings signalisiert die \ U Zeichenkombination ein Unicode erweitert entkommen Codepunkt.

hier ist der Link zu der Dokumentation: http://docs.python.org/3.2/library/subprocess.html

Für Python 3.5+ Sie jetzt() in vielen Fällen verwenden laufen können: https://docs.python.org/3.5/library/subprocess.html#subprocess.run

+2

Python 3.6.3 empfiehlt [run()] (https://docs.python.org/3.6/library/subprocess.html#subprocess.run) –

6

Verwenden subprocess ist es ein kleineres Modul so es läuft die .exe schneller.

import subprocess 
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"]) 
6

Durch die Verwendung von os.system:

import os 
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"') 
+0

Vielen Dank, es funktioniert –

Verwandte Themen