Exécuter un programme extérieur (exécutable) en Python?

Je viens de commencer à travailler sur Python, et j'ai essayé d'exécuter un exécutable extérieur à partir de Python.

J'ai un exécutable pour un programme écrit en Fortran. Disons que le nom de l'exécutable est le débit.EXE. Et mon exécutable est situé dans C:Documents and Settingsflow_model. J'ai essayé les deux os.commandes système et popen, mais jusqu'à présent, je n'ai pas pu le faire fonctionner. Le code suivant semble ouvrir la fenêtre de commande, mais il n'exécuterait pas le modèle.

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

Comment puis-je résoudre ce problème?

66
demandé sur Peter Mortensen 2009-11-28 08:36:50

12 réponses

Ces espaces peuvent vraiment être un problème: - (. Essayez os.chdir('C:/Documents\ and\ Settings/') suivi de chemins relatifs pour os.system, subprocess méthodes, ou quoi que ce soit...

Si le meilleur effort tente de contourner l'obstacle whitespaces-in-path continue à échouer, alors ma meilleure suggestion est de éviter avoir des blancs dans vos chemins cruciaux. Ne pourriez-vous pas créer un répertoire sans espaces, copier le fichier crucial .exe là-bas, et essayer cela? Ces espaces de destruction sont-ils absolument essentiels à votre bien-être...?

33
répondu Alex Martelli 2009-11-28 06:08:35

Si vous utilisez Python 2.7 ou supérieur (en particulier avant Python 3.5), vous pouvez utiliser ce qui suit:

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 returncode.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Exécute la commande avec des arguments. Attend de commande à remplir. Si le code de retour était zéro, alors renvoie, sinon déclenche CalledProcessError. L'objet CalledProcessError aura le code de retour dans le returncode attribut

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

Dans les chaînes Python régulières, la combinaison de caractères \U signale un échappement de point de code Unicode étendu.

Voici 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

36
répondu Ida N 2018-06-03 15:31:06

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

Vous pouvez donc 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 doubles à l'intérieur des guillemets simples...)

18
répondu Adrien Plisson 2018-06-03 15:17:00

J'essaierais d'insérer un ' r ' devant votre chemin si j'étais vous, pour indiquer que c'est une chaîne brute - et alors vous n'aurez pas à utiliser de barres obliques. Par exemple:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")
17
répondu Jon Mills 2018-06-03 15:16:17

Le moyen le plus simple est:

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

Ça marche; je l'ai essayé.

16
répondu Someone 2018-06-03 15:23:39

Utilisez subprocess , c'est un module plus petit donc il exécute le .exe plus rapidement.

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
8
répondu Frodo Baggins 2014-10-06 12:33:25

En utilisant os.système:

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
6
répondu romy 2014-10-16 21:08:17

Essayez

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
3
répondu int3 2009-11-28 05:39:17

Essaie-t-il d'exécuter C:\Documents avec des arguments de "and", "Settings/flow_model/flow.exe"?

Aussi, vous pourriez envisager subprocess.call().

1
répondu Thanatos 2018-06-03 15:15:24

Si c'était moi, je mettrais le fichier EXE dans le répertoire racine (C:) et verrais si cela fonctionne comme ça. Si c'est le cas, ce sont probablement les espaces (déjà mentionnés) dans le nom du répertoire. Sinon, il peut s'agir de certaines variables d'environnement.

Aussi, essayez de vous vérifier stderr (en utilisant une réponse antérieure 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 car je n'utilise généralement pas Popen ou Windows, mais devrait donner l'idée. Il se pourrait bien que le message d'erreur est sur le flux d'erreur.

1
répondu extraneon 2018-06-03 15:20:44

C'est l'utilisation correcte, mais peut-être que les espaces dans le nom du chemin gâchent les choses pour une raison quelconque.

Vous pouvez exécuter le programme sous cmd.exe ainsi que vous pouvez voir n'importe quelle sortie de flow.exe qui pourrait indiquer une erreur.

0
répondu Dan Olson 2009-11-28 05:40:15

Pour la question ci-dessus, cette solution fonctionne.

Il suffit de changer le chemin d'accès à l'emplacement de votre fichier exécutable.

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

Ici test1.pdf rootimage est pour mon code .

0
répondu spurthi 2018-08-16 05:40:22