web-dev-qa-db-fra.com

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

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?

72
Mesut

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 ...?

37
Alex Martelli

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 returncode

Exemple: 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

38
Ida N

Le moyen le plus simple est:

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

Ça marche; Je l'ai essayé.

20
Someone

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")
20
Jon Mills

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 ...)

19
Adrien Plisson

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"])
9
Frodo Baggins

En utilisant os.system :

import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
7
romy

Essayer

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
3
int3

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.

1
extraneon

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().

1
Thanatos
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
0
John

Il existe une multitude de solutions différentes et les résultats dépendront fortement de:

  • le système d'exploitation que vous utilisez: Windows, Cygwin, Linux, MacOS
  • la version de python que vous utilisez: Python2 ou Python3x

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!
  • Rappelez-vous que l'utilisation de 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 utiliserExplorerdans 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. 

0
not2qubit

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)
0
Bomba Ps

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
spurthi

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.

0
Dan Olson