Acabo de empezar 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
. Probé los comandos os.system y popen, pero hasta ahora no pude 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?
python
executable
Mesut
fuente
fuente
Respuestas:
Esos espacios en blanco puede realmente ser una molestia :-(. Trate
os.chdir('C:/Documents\ and\ Settings/')
seguido de rutas relativas paraos.system
,subprocess
métodos, o lo que sea ...Si los intentos del mejor esfuerzo para evitar el obstáculo de los espacios en blanco en el camino siguen fallando, entonces mi siguiente mejor sugerencia es evitar tener espacios en blanco en sus caminos cruciales. ¿No podría hacer un directorio esbozos con menos, copie la clave
.exe
archivo, para tratar de que ? ¿Son esos espacios devastadores absolutamente esenciales para su bienestar ...?fuente
subprocess.Popen
para canalizar los valores deseados allí. Si va más profundo (usando la entrada de "consola"), intente wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
ese archivo exe , como ya mencioné, es la solución más probable, ya que le permite simular exactamente lo que vería ese archivo exe cuando se invoca en una ventana de cmd.Si usa Python 2.7 o superior (especialmente antes de Python 3.5), puede usar lo siguiente:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Ejecuta el comando descrito por args. Espera a que se complete el comando y luego devuelve el atributo de código de retorno.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Ejecuta un comando con argumentos. Espera a que se complete el comando. Si el código de retorno fue cero, entonces regresa; de lo contrario, genera CalledProcessError. El objeto CalledProcessError tendrá el código de retorno en el atributo de código de retornoEjemplo:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
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
fuente
La forma más sencilla es:
Funciona; Lo intenté.
fuente
module 'os' has no attribute 'startfile'
. (Usando python3.6)Intentaría insertar una 'r' delante de su ruta si fuera usted, para indicar que es una cadena sin procesar, y luego no tendrá que usar barras diagonales. Por ejemplo:
fuente
Tu uso es correcto. Apuesto a que su programa externo, flow.exe, debe ejecutarse en su directorio, porque accede a algunos archivos externos almacenados allí.
Entonces podrías intentar:
(Tenga cuidado con las comillas dobles dentro de las comillas simples ...)
fuente
Use subproceso , es un módulo más pequeño, por lo que se ejecuta
.exe
más rápido.fuente
.exe
más rápido?Al usar os.system :
fuente
Tratar
fuente
Si fuera yo, pondrí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, pueden ser algunas variables de entorno.
Además, intente verificar su stderr (usando una respuesta anterior por int3):
Puede que el código no sea del todo correcto ya que normalmente no uso Popen o Windows, pero debería dar la idea. Es muy posible que el mensaje de error esté en la secuencia de errores.
fuente
fuente
en Python 2.6 use una cadena encerrada entre comillas "y apóstrofos '. También un cambio simple / a doble //. Su ejemplo de trabajo se verá así:
También puede utilizar cualquier parámetro si su programa los ingiere.
finalmente, puede usar una variable de cadena, como un ejemplo está trazando usando gnuplot directamente desde python:
fuente
¿Está intentando ejecutar
C:\Documents
con argumentos de"and", "Settings/flow_model/flow.exe"
?Además, podría considerar
subprocess.call()
.fuente
Ese es el uso correcto, pero quizás los espacios en el nombre de la ruta están arruinando las cosas por alguna razón.
Es posible que también desee ejecutar el programa en cmd.exe para que pueda ver cualquier resultado de flow.exe que pueda estar indicando un error.
fuente
Hay muchas soluciones diferentes y los resultados dependerán en gran medida de:
Como he descubierto algunas cosas que se dice que funcionan solo en Windows, no lo hace, probablemente porque uso Cygwin, que está superando la forma del sistema operativo para lidiar con las rutas de Windows. Otras cosas solo funcionan en sistemas operativos basados en * nix puro o en Python2 o 3.
Aquí están mis hallazgos:
os.system()
es el método más indulgente.os.startfile()
es el que menos perdona. (Solo Windows && si tiene suerte)subprocess.Popen([...])
no recomendadosubprocess.run(winView, shell=True)
de la forma recomendada!subprocess
para cualquier cosa puede suponer un riesgo para la seguridad .Prueba estos:
P: ¿Por qué querrías usar
explorer
en Windows?R: Porque si solo desea ver los resultados de algún archivo nuevo, el explorador abrirá automáticamente el archivo con cualquier programa de Windows predeterminado que haya configurado para ese tipo de archivo. Por tanto, no es necesario volver a especificar el programa predeterminado que se utilizará.
fuente
para la pregunta anterior, esta solución funciona.
simplemente cambie la ruta a donde se encuentra su archivo ejecutable.
Aquí test1.pdf rootimage es para mi código.
fuente
"
enos.system
?