L'exécution d'un programme extérieur (exécutable) en Python?
J'ai juste commencé à travailler sur le langage Python, et j'ai essayé d'exécuter un exécutable à partir de l'extérieur de Python.
J'ai un exécutable d'un programme écrit en Fortran. Disons que le nom de l'exécutable est flow.exe. Et mon fichier exécutable se trouve dans C:\Documents and Settings\flow_model
. J'ai essayé les deux os.système et popen commandes, mais jusqu'à présent, je ne pouvais pas le faire fonctionner. Le code suivant me semble qu'il ouvre la fenêtre de commande, mais il ne serait pas exécuter 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?
- Double Possible de l'Appel d'une commande externe en Python
Vous devez vous connecter pour publier un commentaire.
Ces espaces peut être vraiment la peine:-(. Essayez
os.chdir('C:/Documents\ and\ Settings/')
suivie par des chemins relatifs pouros.system
,subprocess
méthodes, ou quoi que...Si best-effort tente de contourner les espaces en voie d'obstacle de garder à défaut, alors ma prochaine meilleure suggestion est de éviter avoir des espaces vides dans votre cruciale chemins. Ne pourriez-vous pas faire un blancs-moins répertoire, copiez le crucial
.exe
fichier, et essayer que? Sont ceux des ravages démolition de l'espace absolument essentiel à votre bien-être...?subprocess.Popen
à la pipe de votre choix des valeurs. Si ça va plus loin (à l'aide de "console d'entrée"), essayez de wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
est la solution la plus probable, car il vous permet de simuler exactement ce que la fichier exe serait de voir lorsqu'il est appelé à une fenêtre cmd.Si à l'aide de Python 2.7 ou supérieur (en particulier avant de Python 3.5), vous pouvez utiliser les éléments suivants:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Exécute la commande décrite par args. Attend de commande à remplir, puis retourne la code_retour attribut.
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Exécute commande avec des arguments. Attend de commande à remplir. Si le code de retour est nul alors retourne, sinon soulève CalledProcessError. Le CalledProcessError objet aura le code de retour dans le code_retour attribut
Exemple:
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+ que vous pouvez désormais utiliser le run() dans de nombreux cas: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
Je vais essayer d'insérer un " r " en face de votre chemin si j'étais vous, pour indiquer que c'est une chaîne brute - et puis, vous n'aurez pas à utiliser des barres obliques. Par exemple:
La façon la plus simple est:
Il fonctionne, je l'ai essayé.
module 'os' has no attribute 'startfile'
. (À l'aide de python3.6)Votre utilisation est correcte. Je parie que votre programme externe, flow.exe doit être exécutée dans son répertoire, car il accède à certains fichiers externes qui y sont stockées.
De sorte que vous pourriez essayer:
(Attention à la double guillemets à l'intérieur des guillemets simples...)
Utilisation sous-processus, c'est un petit module pour qu'il fonctionne le
.exe
plus rapide..exe
plus rapide?En utilisant os.système:
Essayer
Est que d'essayer d'exécuter
C:\Documents
avec des arguments de"and", "Settings/flow_model/flow.exe"
?Aussi, vous pouvez envisager de
subprocess.call()
.Si c'était moi, j'avais mis le fichier EXE dans le répertoire racine (C:) et voir si ça fonctionne comme ça. Si oui, c'est probablement l' (déjà mentionné) des espaces dans le nom du répertoire. Si pas, il peut être certaines variables d'environnement.
Aussi, essayez de vérifier que vous stderr (à l'aide d'une précédente réponse par int3):
Le code peut ne pas être tout à fait correct comme j'ai l'habitude de ne pas utiliser Popen ou Windows, mais devrait donner l'idée. Il se pourrait bien que le message d'erreur est sur le flux d'erreur.
Qui est de la bonne utilisation, mais peut-être que les espaces dans le nom de chemin d'accès sont gâcher les choses pour une certaine raison.
Vous pouvez exécuter le programme en vertu de l'cmd.exe en tant que bien de sorte que vous pouvez voir toute 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 de l'endroit où votre fichier exécutable est situé.
Ici test1.pdf rootimage est pour mon code .
"
dansos.system
?Il y a des tas de solutions différentes, et les résultats dépendent fortement de:
Que j'ai découvert certaines choses qui sont réclamés pour fonctionner uniquement sous Windows, n'est-ce pas, probablement parce qu'il m'arrive d'utiliser Cygwin qui est de déjouer le système d'exploitation façon de traiter avec les chemins d'accès Windows. D'autres choses que le travail dans le plus pur *nix en fonction du système d'exploitation ou dans Python2 ou 3.
Voici mes conclusions:
os.system()
est le plus facile à la méthode.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
pour rien peut poser un risque de sécurité.Essayez ces:
Q: Pourquoi voudriez-vous d'utiliser
explorer
dans Windows?Un: Parce que si vous voulez juste regarder les résultats d'un nouveau fichier, l'explorateur s'ouvre automatiquement le fichier avec quoi que ce soit par défaut de windows programme que vous avez défini pour ce type de fichier. Donc pas besoin de re-préciser le programme par défaut à utiliser.
en python 2.6 utilisation de la chaîne enfermés à l'intérieur de devis "et de l'apostrophe' marques. Également un changement simple /double //.
Votre exemple de travail ressemblera à ceci:
Vous pouvez également utiliser les paramètres si Votre programme de les avaler.
enfin, Vous pouvez utiliser la variable de chaîne, comme un exemple est tracé à l'aide de gnuplot directement à partir de python: