Je viens juste de commencer à travailler sur Python et j'essaie de lancer un exécutable externe à partir de Python.
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 est situé dans C:\Documents and Settings\flow_model
. J'ai essayé les commandes os.system et popen, mais je ne pouvais pas le faire fonctionner jusqu'à présent. Le code suivant semble ouvrir la fenêtre de commande, mais il n'exécute 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éparer cela?
Ces espaces peuvent vraiment être un problème :-(. Essayez os.chdir('C:/Documents\ and\ Settings/')
suivi de chemins relatifs pour les méthodes os.system
, subprocess
, ou peu importe ...
Si tous les efforts possibles tentent de contourner l'obstacle d'espacement sur les chemins, notre meilleure suggestion consiste à éviter d'avoir des blancs sur vos chemins essentiels. Ne pourriez-vous pas créer un répertoire sans espaces, copier le fichier .exe
essentiel et essayer that ? Ces espaces dévastateurs sont-ils absolument essentiels à votre bien-être ...?
Si vous utilisez Python 2.7 ou une version ultérieure (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 returncode.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, Shell=False)
Exécute une commande avec des arguments. Attend la fin de la commande. Si le code de retour était égal à zéro, il retourne sinon, déclenche CalledProcessError. L'objet CalledProcessError aura le code de retour dans l'attribut returncodeExemple: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
Dans les chaînes Python normales, 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
Le moyen le plus simple est:
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
Ça marche; Je l'ai essayé.
J'essaierais d'insérer un «r» devant votre chemin si j'étais vous pour indiquer qu'il s'agit d'une chaîne brute - et vous n'aurez alors pas à utiliser de barres obliques. Par exemple:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
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.
Donc, vous pourriez essayer:
import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')
(Attention aux guillemets dans les guillemets simples ...)
Utilisez subprocess , il s’agit d’un module plus petit qui exécute le .exe
plus rapidement.
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
En utilisant os.system :
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
Essayer
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
Si c’était moi, je mettrais le fichier EXE dans le répertoire racine (C :) et verrais s’il fonctionnait comme ça. Si c'est le cas, il s'agit probablement des espaces (déjà mentionnés) du nom du répertoire. Sinon, il peut s'agir de variables d'environnement.
Aussi, essayez de vérifier votre stderr (en utilisant une réponse précédente de 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 peut ne pas être tout à fait correct car je n'utilise généralement pas Popen ou Windows, mais je devrais donner une idée. Il se peut que le message d’erreur se trouve dans le flux d’erreurs.
Est-ce que cela tente d'exécuter C:\Documents
avec les arguments de "and", "Settings/flow_model/flow.exe"
?
En outre, vous pourriez envisager subprocess.call()
.
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
Il existe une multitude de solutions différentes et les résultats dépendront fortement de:
Comme je l’ai découvert, certaines choses censées fonctionner uniquement sous Windows ne le sont pas, probablement parce que j’utilise par hasard Cygwin, qui déjoue le système d’exploitation pour traiter les chemins Windows. D'autres choses ne fonctionnent que dans les systèmes d'exploitation à base pure * nix ou dans Python2 ou 3.
Voici mes conclusions:
os.system()
est généralement la méthode la plus indulgente.os.startfile()
est le moins indulgent. (Windows uniquement && si vous avez de la chance)subprocess.Popen([...])
not recommandésubprocess.run(winView, Shell=True)
la manière recommandée!subprocess
pour n'importe quoi peut poser un risque pour la sécurité .Essayez ces:
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)
Q: Pourquoi voudriez-vous utiliserExplorer
dans Windows?
R: Parce que si vous voulez juste regarder les résultats d'un nouveau fichier, Explorer l'ouvrira automatiquement avec le programme Windows par défaut que vous avez défini pour ce type de fichier. Donc, pas besoin de re-spécifier le programme par défaut à utiliser.
en python 2.6, utilisez une chaîne entourée de guillemets "et des marques apostrophe '. Aussi, une modification simple/à double //. Votre exemple de travail ressemblera à ceci:
import os
os.system("'C://Documents and Settings//flow_model//flow.exe'")
Vous pouvez aussi utiliser n’importe quel paramètre si votre programme les ingère.
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"')
enfin, vous pouvez utiliser une variable de chaîne:
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)
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.
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 voudrez peut-être aussi exécuter le programme sous cmd.exe afin de pouvoir visualiser toute sortie de flow.exe pouvant indiquer une erreur.