otro - Ejecutando un programa externo(ejecutable) en Python?
python ejecutar programa externo (11)
Empecé a trabajar en Python y he estado intentando ejecutar un ejecutable externo desde Python.
Tengo un ejecutable para un programa escrito en Fortran. Digamos que el nombre del ejecutable es flow.exe. Y mi ejecutable se encuentra en C:/Documents and Settings/flow_model
. Intenté ambos comandos os.system y popen, pero hasta ahora no podía hacerlo funcionar. El siguiente código parece que abre la ventana de comandos, pero no ejecuta el modelo.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
¿Cómo puedo arreglar esto?
¿Es eso intentar ejecutar C:/Documents
con argumentos de "and", "Settings/flow_model/flow.exe"
?
Además, puede considerar subprocess.call()
.
Al usar os.system :
import os
os.system(r''"C:/Documents and Settings/flow_model/flow.exe"'')
Ese es el uso correcto, pero tal vez los espacios en el nombre de la ruta están estropeando las cosas por alguna razón.
Es posible que desee ejecutar el programa en cmd.exe para que pueda ver cualquier resultado de flow.exe que pueda estar indicando un error.
Esos espacios en blanco realmente pueden ser una molestia :-(. Pruebe os.chdir(''C:/Documents/ and/ Settings/'')
seguido de rutas relativas para os.system
, subprocess
methods, o lo que sea ...
Si los intentos de mejor esfuerzo para eludir el obstáculo de los espacios en blanco siguen fallando, entonces mi siguiente mejor sugerencia es evitar tener espacios en blanco en los caminos cruciales. ¿No podrías hacer un directorio sin espacios en blanco, copiar el archivo .exe
crucial allí y probar eso ? ¿Son esos espacios de destrucción de estragos absolutamente esenciales para su bienestar ...?
La forma más simple es:
import os
os.startfile("C:/Documents and Settings/flow_model/flow.exe")
Funciona; Lo intenté.
Si fuera yo, colocaría el archivo EXE en el directorio raíz (C :) y vería si funciona así. Si es así, probablemente sean los espacios (ya mencionados) en el nombre del directorio. Si no, puede ser algunas variables de entorno.
Además, intente comprobar su stderr (utilizando una respuesta anterior por int3):
import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], /
stderr = subprocess.PIPE)
if process.stderr:
print process.stderr.readlines()
El código puede no ser del todo correcto, ya que normalmente no uso Popen o Windows, pero debería dar la idea. Bien podría ser que el mensaje de error esté en la secuencia de error.
Si usa Python 2.7 o superior (especialmente antes de Python 3.5) puede usar lo siguiente:
import subprocess
-
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Ejecuta el comando descrito por args. Espera a que se complete el comando, luego devuelve el atributo de código de retorno. -
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Ejecuta el comando con argumentos. Espera a que el comando se complete. Si el código de retorno era cero, entonces vuelve, de lo contrario aumenta CalledProcessError. El objeto CalledProcessError tendrá el código de retorno en el atributo de código de retorno
Ejemplo: subprocess.check_call([r"C:/pathToYourProgram/yourProgram.exe", "your", "arguments", "comma", "separated"])
En cadenas regulares de Python, la combinación de caracteres / U señala un escape de punto de código Unicode extendido.
Aquí está el enlace a la documentación: http://docs.python.org/3.2/library/subprocess.html
Para Python 3.5+ ahora puede usar run () en muchos casos: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
Tratar
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
Trataría de insertar una ''r'' delante de tu camino si fuera tú, para indicar que es una cadena en bruto, y entonces no tendrás que usar barras diagonales. Por ejemplo:
os.system(r"C:/Documents and Settings/flow_model/flow.exe")
Tu uso es correcto Apuesto a que su programa externo, flow.exe, necesita ser ejecutado en su directorio, porque accede a algunos archivos externos almacenados allí.
Así que puedes intentar:
import sys, string, os, arcgisscripting
os.chdir(''c://documents and settings//flow_model'')
os.system(''"C://Documents and Settings//flow_model//flow.exe"'')
(Cuidado con las comillas dobles dentro de las comillas simples ...)
Use subproceso , es un módulo más pequeño para que ejecute el .exe
más rápido.
import subprocess
subprocess.Popen([r"U:/Year 8/kerbal space program/KSP.exe"])