Ein externes Programm (ausführbar) in Python ausführen?

91

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?

Mesut
quelle
2
Mögliches Duplikat des
Aufrufs

Antworten:

45

Diese Leerzeichen können wirklich störend sein :-(. Versuchen Sie, os.chdir('C:/Documents\ and\ Settings/')relativen Pfaden für os.system, subprocessMethoden 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 .exedort Datei, und versuchen Sie das ? Sind diese zerstörerischen Räume für Ihr Wohlbefinden absolut notwendig ...?

Alex Martelli
quelle
1
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 machen, konnte aber bisher keinen Erfolg haben?
Mesut
2
@mesut, was ist diese ausführbare Datei, um nach dem Dateinamen zu "fragen"? Wenn es sich beispielsweise um eine eigene Standardeingabe handelt, können Sie möglicherweise subprocess.PopenIhre 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 .
Alex Martelli
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, diesen Namen (möglicherweise als Pfad) im Code zu definieren? Ich habe versucht, subprocess.popen und ich habe versucht, in den Variablen zu suchen. Ich dachte, dass ich stdin verwenden kann, aber es hat nicht wirklich geklappt. Ich würde mich sehr freuen, wenn Sie mir ein Beispiel mit subprocess.popen mit der ausführbaren Datei in C: \ flow_model, dem Namen der ausführbaren Datei als flow.exe und dem Namen der Eingabedatei im selben Ordner wie sac_bsl.txt
Mesut
Der Teil "Nach dem Namen der Eingabedatei fragen" ist problematisch. Wie ich bereits erwähnt habe, wexpectist 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.
Alex Martelli
42

Wenn Sie Python 2.7 oder höher verwenden (insbesondere vor Python 3.5), können Sie Folgendes verwenden:

import subprocess
  • 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-Attribut

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

In regulären Python-Zeichenfolgen signalisiert die \ U-Zeichenkombination ein erweitertes Unicode-Codepunkt-Escape.

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

Ida N.
quelle
7
Python 3.6.3 empfiehlt run ()
Ricardo Zorio
31

Der einfachste Weg ist:

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

Es klappt; Ich versuchte es.

Jemand
quelle
funktioniert richtig, aber gibt es eine Möglichkeit, Parameter wie -start usw. hinzuzufügen?
Bassem Shahin
1
Funktioniert nicht : module 'os' has no attribute 'startfile'. (Mit Python3.6)
not2qubit
Anscheinend funktioniert es unter Windows nicht, entgegen dem Eindruck, den die Dokumentation vermittelt.
not2qubit
24

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:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")
Jon Mills
quelle
19

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:

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

(Achten Sie auf die doppelten Anführungszeichen in den einfachen Anführungszeichen ...)

Adrien Plisson
quelle
Funktioniert perfekt, wie würde man die Ergebnisse direkt in einem Datenrahmen speichern?
Sade
11

Verwenden Sie einen Unterprozess , es ist ein kleineres Modul, damit es .exeschneller läuft .

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
Frodo Beutlin
quelle
1
Sie meinen , es beginnt die .exeschneller?
Peter Mortensen
7

Mit os.system :

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
Romy
quelle
4

Versuchen

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
int3
quelle
versuchte es und das gleiche passierte. Es scheint, als würde das Cmd-Fenster geöffnet, aber dann würde die ausführbare Datei nicht ausgeführt. Ich habe die ausführbare Datei separat ausprobiert und sie funktioniert einwandfrei. Ich habe den Ordner auch als C: / flow_model verschoben. Hat keinen Unterschied gemacht. ??
Mesut
2

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):

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 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.

Extraneon
quelle
2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
John
quelle
1
Bitte fügen Sie eine Erklärung hinzu, warum Ihr Code diese Frage löst.
rje
In diesem Beitrag wird die ausgeführte * .exe-Datei grundsätzlich so behandelt, als würden Sie die Windows * .bat-Datei verwenden.
SamAct
2

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:

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

Sie können auch beliebige Parameter verwenden, wenn Ihr Programm sie aufnimmt.

os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')

Schließlich können Sie die Zeichenfolgenvariable verwenden. Ein Beispiel ist das Plotten mit Gnuplot direkt aus Python:

this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot'

this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"'
os.system(this_program+" "+this_par)
Bomba Ps
quelle
1

Versucht das, C:\Documentsmit Argumenten von auszuführen "and", "Settings/flow_model/flow.exe"?

Auch könnten Sie in Betracht ziehen subprocess.call().

Thanatos
quelle
0

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.

Dan Olson
quelle
0

Es gibt viele verschiedene Lösungen, und die Ergebnisse hängen stark ab von:

  • das Betriebssystem, das Sie verwenden: Windows, Cygwin, Linux, MacOS
  • Die von Ihnen verwendete Python-Version: Python2 oder Python3x

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:

  • Im Allgemeinen os.system()ist die Methode am verzeihendsten.
  • os.startfile()ist am wenigsten verzeihend. (Nur Windows && wenn Sie Glück haben)
  • subprocess.Popen([...]) nicht empfohlen
  • subprocess.run(winView, shell=True) der empfohlene Weg!
  • Denken Sie daran, dass die Verwendung subprocessfür alles ein Sicherheitsrisiko darstellen kann .

Probiere diese:

import os, subprocess
...
winView = '/cygdrive/c/Windows/explorer.exe %s' % somefile
...
# chose one of these:
os.system(winView)
subprocess.Popen(['/cygdrive/c/Windows/explorer.exe', 'somefile.png'])
subprocess.run(winView, shell=True)

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.

not2qubit
quelle
0

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.

import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system("C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\flowwork.exe")


'''import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\pdftopng.exe test1.pdf rootimage")'''

Hier ist test1.pdf rootimage für meinen Code.

spurthi
quelle
Haben Sie eine Schließung vergessen "in os.system?
Suraj Rao