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?
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...?
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
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...)
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")
Le moyen le plus simple est:
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
Ça marche; je l'ai essayé.
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"])
En utilisant os.système:
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
Essayez
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
Essaie-t-il d'exécuter C:\Documents
avec des arguments de "and", "Settings/flow_model/flow.exe"
?
Aussi, vous pourriez envisager subprocess.call()
.
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.
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.
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 .