Frage

Ich habe gerade angefangen auf Python zu arbeiten, und ich habe versucht, eine externe ausführbare Datei von Python zu laufen.

Ich habe eine ausführbare Datei für ein Programm in Fortran geschrieben. Lassen Sie uns sagen, dass der Name für die ausführbare flow.exe ist. Und meine ausführbare Datei ist in C:\Documents and Settings\flow_model befindet. Ich habe versucht, sowohl os.system und popen Befehle, aber bisher konnte ich nicht damit es funktioniert. Der folgende Code scheint, wie es das Befehlsfenster öffnet, aber es würde das Modell nicht aus.

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

Wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Diese Whitespaces kann wirklich :-( eine Mühe sein. Versuchen Sie os.chdir('C:/Documents\ and\ Settings/') durch relative Pfade für os.system, subprocess Methoden gefolgt, oder was auch immer ...

Wenn best-effort versucht, die Whitespaces-in-Pfad Hürde zu umgehen, hält versagt, dann mein nächster bester Vorschlag ist, auf vermeiden mit Leerzeichen in Ihrem entscheidenden Weg. Könnten Sie nicht ein Rohlingen lose Verzeichnis machen, kopieren Sie die entscheidenden .exe Datei gibt, und versuchen Sie , dass ? Sind diejenigen, Chaos zehrende Raum absolut notwendig, um Ihr Wohlbefinden ...?

Andere Tipps

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

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Führt den Befehl von args beschrieben. Wartet auf Befehl zu vollenden, dann gibt das Rückkehr Attribut.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Läuft Befehl mit Argumenten. Wartet auf Befehl zu vervollständigen. Wenn der Rückkehrcode Null war dann zurückkehrt, sonst wirft CalledProcessError. Das CalledProcessError Objekt wird den Return-Code in der Rückkehr Attribute

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

  

In regelmäßigen Python-Strings, die \ U Zeichenkombination Signale a   erweiterte Unicode-Codepunkt zu entkommen.

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

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

Ich würde versuchen, ein ‚r‘ vor Ihrem Weg eingefügt, wenn ich Sie wäre, um anzuzeigen, dass es sich um eine rohe Zeichenfolge ist - und dann werden Sie nicht vorwärts Schrägstriche verwenden. Zum Beispiel:

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

Der einfachste Weg ist:

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

Es funktioniert; Ich versuchte es.

Ihre Nutzung ist richtig. Ich wette, dass Ihr externes Programm, flow.exe, in seinem Verzeichnis ausgeführt werden muss, weil es einige externe dort gespeicherten Dateien zugreift.

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"')

(Vorsicht vor den doppelten Anführungszeichen innerhalb der einfachen Anführungszeichen ...)

Mit subprocess , es ist ein kleineres Modul, so dass es die .exe schneller läuft.

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

Durch die Verwendung von os.system :

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

Versuchen

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

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

Auch Sie könnten subprocess.call() betrachten.

Wenn es nach mir ginge, würde ich die EXE-Datei im Stammverzeichnis (C :) setzen und sehen, ob es so funktioniert. Wenn ja, ist es wahrscheinlich die (bereits erwähnt) Leerzeichen im Verzeichnisnamen. Wenn nicht, kann es einige Umgebungsvariablen 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 vielleicht nicht ganz korrekt, wie ich in der Regel, nicht Popen oder Windows verwenden, sondern die Idee geben. Es könnte gut sein, dass die Fehlermeldung auf dem Fehlerstrom ist.

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

Sie können das Programm unter cmd.exe auch laufen, so dass Sie keine Ausgabe von flow.exe sehen kann, die einen Fehler könnte angibt.

Für die oben stehende Frage diese Lösung funktioniert.

nur den Pfad ändern, wo die 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(r"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 test1.pdf rootimage ist für meinen Code.

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

Es gibt viele verschiedene Lösungen, und die Ergebnisse werden stark abhängig von:

  • das Betriebssystem Sie verwenden: Fenster, Cygwin, Linux, MacOS
  • die Python-Version Sie verwenden: Python2 oder Python3x

Als ich einige Dinge entdeckt, die behaupten, nur in Windows zu arbeiten, nicht, wahrscheinlich, weil ich zufällig Cygwin verwenden, das das Betriebssystem Art und Weise wird outsmarting mit Windows-Pfaden zu beschäftigen. Andere Dinge funktionieren nur in reinen * nichts-basierten Betriebssystemen oder in Python2 oder 3

Hier sind meine Ergebnisse:

  • Im Allgemeinen os.system() ist die fehlerverzeihendsten Methode.
  • os.startfile() ist die am wenigsten nachsichtig. (Nur Windows && wenn Sie Glück haben)
  • subprocess.Popen([...]) nicht empfohlen
  • subprocess.run(winView, shell=True) die empfohlene Art und Weise!
  • Daran erinnernd, dass mit subprocess für etwas kann stellen ein Sicherheitsrisiko dar .

Versuchen Sie 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)

Frage: Warum würden Sie verwenden möchten explorer in Windows?

A: Denn wenn man nur auf die Ergebnisse von einigen neuen Datei suchen möchten, Explorer mit der Datei wird automatisch geöffnet, was auch immer Standard-Windows-Programm, das Sie für diesen Dateityp festgelegt haben. Also keine Notwendigkeit, wieder gibt das Standardprogramm zu verwenden.

in Python 2.6 Verwendung String in Anführungszeichen eingeschlossen "und Marken" Apostroph. Auch eine Änderung single / verdoppeln //. Ihr Arbeitsbeispiel wird wie folgt aussehen:

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

Sie können auch alle Parameter verwenden, wenn Ihr Programm sie einnehmen.

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 String-Variable verwenden, als Beispiel Plotten verwendet 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top