Je viens de commencer à travailler sur Python et j'ai essayé d'exécuter 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 se trouve dans C:\Documents and Settings\flow_model
. J'ai essayé les commandes os.system 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é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?
python
executable
Mesut
la source
la source
Réponses:
Ces espaces peuvent vraiment être un problème :-(. Essayez de
os.chdir('C:/Documents\ and\ Settings/')
suivre des chemins relatifs pouros.system
, dessubprocess
méthodes, ou autre ...Si les meilleurs efforts pour contourner l'obstacle des espaces dans le chemin continuent d'échouer, ma prochaine meilleure suggestion est d' éviter d' avoir des blancs dans vos chemins cruciaux. Ne pourriez-vous pas créer un répertoire sans espaces, y copier le
.exe
fichier crucial et essayer cela ? Ces espaces dévastateurs sont-ils absolument essentiels à votre bien-être ...?la source
subprocess.Popen
pour y diriger les valeurs souhaitées. Si cela va plus loin (en utilisant l'entrée "console"), essayez wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
est la solution la plus probable, car elle vous permet de simuler exactement ce que ce fichier exe verrait lorsqu'il est appelé dans une fenêtre cmd.Si vous utilisez Python 2.7 ou supérieur (en particulier avant Python 3.5), vous pouvez utiliser ce qui suit:
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 la fin de la commande. Si le code de retour était zéro, 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"])
Voici le lien vers la documentation: http://docs.python.org/3.2/library/subprocess.html
Pour Python 3.5+, vous pouvez désormais utiliser run () dans de nombreux cas: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
la source
Le moyen le plus simple est:
Ça marche; Je l'ai essayé.
la source
module 'os' has no attribute 'startfile'
. (Utilisation de python3.6)J'essaierais d'insérer un «r» devant votre chemin si j'étais vous, pour indiquer que c'est une chaîne brute - et vous n'aurez pas à utiliser de barres obliques. Par exemple:
la source
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.
Alors vous pourriez essayer:
(Méfiez-vous des guillemets doubles à l'intérieur des guillemets simples ...)
la source
Utilisez un sous - processus , c'est un module plus petit donc il s'exécute le
.exe
plus rapidement.la source
.exe
plus vite?En utilisant os.system :
la source
Essayer
la source
Si c'était moi, je mettrais le fichier EXE dans le répertoire racine (C :) et verrais si cela fonctionne comme ça. Si tel 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.
Essayez également de vérifier votre stderr (en utilisant une réponse précédente par int3):
Le code n'est peut-être pas tout à fait correct car je n'utilise généralement pas Popen ou Windows, mais je devrais donner l'idée. Il se peut que le message d'erreur se trouve dans le flux d'erreur.
la source
la source
en python 2.6, utilisez une chaîne entre guillemets "et apostrophe". Également un changement simple / en double //. Votre exemple de travail ressemblera à ceci:
Vous pouvez également utiliser tous les paramètres si votre programme les ingère.
Enfin, vous pouvez utiliser une variable de chaîne, comme un exemple de traçage en utilisant gnuplot directement à partir de python:
la source
Est-ce que cela tente de s'exécuter
C:\Documents
avec des arguments de"and", "Settings/flow_model/flow.exe"
?Aussi, vous pourriez envisager
subprocess.call()
.la source
C'est l'usage correct, mais peut-être que les espaces dans le nom du chemin gâchent les choses 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.
la source
Il existe de nombreuses solutions différentes, et les résultats dépendront fortement de:
Comme j'ai découvert certaines choses qui sont censées fonctionner uniquement sous Windows, ce n'est probablement pas le cas, probablement parce que j'utilise Cygwin, qui déjoue la façon dont le système d'exploitation gère les chemins Windows. D'autres choses ne fonctionnent que dans les systèmes d'exploitation basés sur * nix purs ou en Python2 ou 3.
Voici mes conclusions:
os.system()
c'est la méthode la plus indulgente.os.startfile()
est le moins indulgent. (Windows uniquement && si vous avez de la chance)subprocess.Popen([...])
pas recommandésubprocess.run(winView, shell=True)
la manière recommandée!subprocess
de n'importe quoi peut poser un risque pour la sécurité .Essayez ceci:
Q: Pourquoi voudriez-vous l'utiliser
explorer
sous Windows?R: Parce que si vous voulez simplement regarder les résultats d'un nouveau fichier, l'explorateur ouvrira automatiquement le fichier 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.
la source
pour la question ci-dessus, cette solution fonctionne.
changez simplement le chemin vers l'emplacement de votre fichier exécutable.
Ici, test1.pdf rootimage est pour mon code.
la source
"
enos.system
?