121 votes

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

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 est situé dans C:\Documents and Settings\flow_model . J'ai essayé les commandes os.system et popen, mais jusqu'à présent, je n'ai pas réussi à faire fonctionner le système. 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ésoudre ce problème ?

54voto

Ida N Points 272

Si vous utilisez Python 2.7 ou plus (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 une commande avec des arguments. Attend la fin de la commande. Si le code de retour est égal à zéro, retourne, sinon lève 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 de caractères Python ordinaires, l'élément \U combinaison de caractères 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

48voto

Alex Martelli Points 330805

Ces espaces blancs peuvent vraiment être gênants. Essayez os.chdir('C:/Documents\ and\ Settings/') suivi des chemins relatifs pour os.system , subprocess méthodes, ou autre...

Si les tentatives de contournement de l'obstacle des espaces blancs dans le chemin d'accès continuent d'échouer, la meilleure suggestion qui me vient à l'esprit est la suivante éviter avoir des blancs dans vos chemins cruciaux. Ne pourriez-vous pas créer un répertoire sans blanc, copier les chemins cruciaux de .exe à cet endroit, et essayez que ? Ces espaces destructeurs sont-ils absolument indispensables à votre bien-être ?

48voto

Someone Points 31

La méthode la plus simple est la suivante :

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

Cela fonctionne, j'ai essayé.

30voto

LuckySevens Points 586

À votre place, j'essaierais d'insérer un "r" devant votre chemin d'accès pour indiquer qu'il s'agit d'une chaîne de caractères brute, ce qui vous évitera d'utiliser des barres obliques. Vous n'aurez alors pas besoin d'utiliser des barres obliques :

os.system(r"C:\Documents and Settings\flow_model\flow.exe")

23voto

Adrien Plisson Points 9750

Votre utilisation est correcte. Je parie que votre programme externe, flow.exe, doit être exécuté dans son répertoire, car il accède à des 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"')

(Attention aux guillemets doubles à l'intérieur des guillemets simples...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X