2009-11-28 5 views
53

Je viens de commencer à travailler sur python et j'ai essayé d'exécuter un python sous forme d'exécutable externe. J'ai un exécutable pour un programme écrit en Fortran. Disons que le nom de l'exécutable est flow.exe. Et mon exécutable se trouve dans C: \ Documents and Settings \ flow_model J'ai essayé les commandes os.system et popen mais jusqu'à présent, je ne pouvais pas le faire fonctionner. Le code suivant semble ouvrir la fenêtre de commande mais ne pas exécuter le modèle.exécuter un programme externe (exécutable) en python?

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

Des suggestions? Toute aide serait grandement appréciée.

+1

double possible de [Appel d'une commande externe en Python] (https://stackoverflow.com/questions/89228/calling-an-external-command-in -python) – mkobit

Répondre

25

Ces espaces blancs peuvent vraiment être pris la peine :-(. Essayez os.chdir('C:/Documents\ and\ Settings/') suivi des chemins relatifs pour os.system, subprocess méthodes, ou peu importe ...

Si best effort tente de contourner le en espaces blancs chemin obstacle continuer à échouer, alors ma meilleure suggestion est de éviter avoir des espaces dans vos chemins cruciaux.Pourriez-vous pas faire un répertoire sans blanc, copiez le fichier crucial .exe là, et essayez que? absolument essentiel à votre bien-être ...?

+0

Alex, merci. Cela a fonctionné aussi. J'ai une autre question si cela ne vous dérange pas. Que se passe-t-il si mon exécutable demande le nom de mon fichier d'entrée? J'ai essayé de le faire en utilisant stdin mais je ne pouvais pas réussir jusqu'à présent? – Mesut

+1

@mesut, qu'est-ce que cet exécutable utilise pour "demander" le nom de fichier? Si c'est sa propre entrée standard, par exemple, vous pourriez utiliser 'subprocess.Popen' pour y acheminer vos valeurs désirées. Si cela devient plus profond (en utilisant l'entrée "console"), essayez wexpect, http://sage.math.washington.edu/home/goreckc/sage/wexpect/. –

+0

le fichier d'entrée est un fichier .txt de base dans le même dossier. Le code ouvre maintenant l'exe de la fenêtre cmd. Et l'exécutable demande le nom du fichier d'entrée. Est-il possible que je puisse simplement définir ce nom (peut-être comme un chemin) dans le code? J'ai essayé subprocess.popen et j'ai essayé de regarder dans les variables. Je pensais que je peux utiliser stdin mais ne fonctionne pas vraiment. J'apprécierais vraiment si vous pouvez me donner un échantillon avec subprocess.popen avec l'exécutable situé dans C: \ flow_model, le nom de l'exécutable comme flow.exe et le nom du fichier d'entrée situé dans le même dossier que sac_bsl.txt – Mesut

1

Est-ce que cela tente d'exécuter C:\Documents avec des arguments de "and", "Settings/flow_model/flow.exe"?

En outre, vous pouvez envisager subprocess.call()

2

Essayez

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

l'a essayé et la même chose s'est produite. il semble que cela ouvre la fenêtre cmd mais alors il ne fonctionnerait pas l'exécutable. J'ai essayé l'exécutable séparément et cela fonctionne très bien. J'ai également déplacé le dossier en tant que C:/flow_model. N'a pas fait la différence. ?? – Mesut

0

C'est l'utilisation correcte, mais peut-être les espaces dans le nom de chemin sont tout embrouiller pour une raison quelconque. Vous pouvez également exécuter le programme sous cmd.exe afin de voir toute sortie de flow.exe qui pourrait indiquer une erreur.

14

Je vais essayer d'insérer un « r » devant votre chemin si je vous, pour indiquer que sa première une chaîne - et alors vous ne devez utiliser des barres obliques, par exemple:

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

votre utilisation est correcte, je parie que votre programme externe, flow.exe, doit être exécuté dans son répertoire car il accède à certains fichiers externes qui y sont stockés.

de sorte que vous pouvez essayer:

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

(méfiez-vous des guillemets à l'intérieur des guillemets simples ...)

+1

Adrien, Merci, cela a fonctionné. – Mesut

1

Si elle était moi, je mettrais l'exe dans le diretcory racine (C :) et voir si ça marche comme ça. Si c'est le cas, il s'agit probablement des espaces (déjà mentionnés) dans le nom du répertoire. Sinon, il peut s'agir de variables d'environnement.

Aussi, essayez de vous vérifier stderr (à l'aide d'une réponse précédente par Int3):

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

Le code pourrait ne pas être tout à fait correct que je ne l'utilise généralement pas Popen ou les fenêtres, mais devrait donner l'idée . Il se peut que le message d'erreur apparaisse dans le flux d'erreurs.

13

La façon la plus simple est:

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

Il fonctionne, je l'ai essayé.

32

Si l'aide Python 2.7 ou supérieur (en particulier avant Python 3.5) vous pouvez utiliser les éléments suivants:

import subprocess 
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Exécute la commande décrite par args. Attend la fin de la commande, puis renvoie l'attribut de code de retour.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Exécute la commande avec des arguments. Attend que la commande soit terminée. Si le code de retour était zéro retourne alors, sinon déclenche CalledProcessError. L'objet CalledProcessError aura le code de retour dans l'returnCode attribut

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

dans les chaînes de python régulières, la combinaison de caractères \ U signale une étendu Unicode CodePoint échapper.

ici est le lien vers la documentation: http://docs.python.org/3.2/library/subprocess.html

Pour Python 3.5+ vous pouvez maintenant utiliser run() dans de nombreux cas: https://docs.python.org/3.5/library/subprocess.html#subprocess.run

+2

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

6

Utilisez subprocess, il est un module plus petit donc il court le .exe plus rapidement.

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

En utilisant os.system:

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

Merci beaucoup de son travail –