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 ?

12voto

Frodo Baggins Points 121

Utilisation sous-processus Il s'agit d'un module plus petit, qui fait donc fonctionner le système d'information de l'UE. .exe rapide.

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])

9voto

romy Points 91

En utilisant os.system :

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

3voto

int3 Points 6370

Pruebe

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

3voto

extraneon Points 13362

Si c'était moi, je mettrais le fichier EXE dans le répertoire racine (C :) et je verrais si cela fonctionne ainsi. Si c'est le cas, c'est probablement à cause des 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 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 n'est peut-être pas tout à fait correct car je n'utilise généralement pas Popen ou Windows, mais il devrait donner une idée. Il se pourrait bien que le message d'erreur se trouve dans le flux d'erreur.

3voto

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

Note ajoutée par barlop

Un commentateur a demandé pourquoi cela fonctionnait. Voici pourquoi.

Le problème de l'OP est que os.system("...") ne fonctionne pas correctement lorsqu'il y a un espace dans le chemin. (Note os.system peut fonctionner avec ('"...."') mais quoi qu'il en soit)

Si l'OP avait essayé son programme à partir d'une invite cmd, il aurait vu clairement l'erreur.

    C:\\carp>type blah.py
    import  os
    os.system(R"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe")

    C:\\carp>python blah.py
    'C:\\Program' is not recognized as an internal or external command,
    operable program or batch file.

    C:\\carp>

Ainsi, tout va bien pour os.system("calc.exe") (où calc.exe est dans la variable d'environnement path). Ou pour os.system(R "c : \windows\system32\calc.exe "). Il n'y a pas d'espace dans ce chemin.

C:\>md "aa bb cc"

C:\>copy c:\windows\system32\calc.exe "c:\aa bb cc\cccalc.exe"
        1 file(s) copied.

Cela fonctionne (fichier donné "c : \aa bb cc \cccalc.exe " )

import  os 
os.chdir(R"c:\aa bb cc")
os.system("cccalc.exe")

Les autres options sont subprocess.run et subprocess.popen.

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