Tengo un script de Python que necesita ejecutar un programa externo, pero por alguna razón falla.
Si tengo el siguiente script:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Entonces falla con el siguiente error:
'C: \ Temp \ a' no se reconoce como un comando interno o externo, programa operativo o archivo por lotes.
Si escapo del programa con comillas:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Entonces funciona. Sin embargo, si agrego un parámetro, deja de funcionar nuevamente:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
¿Cuál es la forma correcta de ejecutar un programa y esperar a que se complete? No necesito leer el resultado, ya que es un programa visual que hace un trabajo y luego simplemente sale, pero necesito esperar a que se complete.
También tenga en cuenta, mover el programa a una ruta no espaciada tampoco es una opción.
Esto tampoco funciona:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Tenga en cuenta las comillas simples / dobles intercambiadas.
Con o sin un parámetro para el Bloc de notas aquí, falla con el mensaje de error
El nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta de volumen es incorrecta.
fuente
os.system(r'C:\temp\"a b c"\Notepad.exe')
o esto:os.system('C:\\temp\\"a b c"\\Notepad.exe')
"C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif"
. En Python, se convierte en:["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Respuestas:
subprocess.call
evitará problemas al tener que lidiar con convenciones de cotización de varios shells. Acepta una lista, en lugar de una cadena, por lo que los argumentos se delimitan más fácilmente. es decirfuente
subprocess.call
debe reemplazarse porsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiAquí hay una forma diferente de hacerlo.
Si está utilizando Windows, lo siguiente actúa como hacer doble clic en el archivo en el Explorador, o dar el nombre del archivo como argumento para el comando "iniciar" de DOS: el archivo se abre con cualquier aplicación (si la hay) a la que está asociada su extensión .
Ejemplo:
Esto abrirá textfile.txt con el Bloc de notas si el Bloc de notas está asociado con archivos .txt.
fuente
webbrowser.open("textfile.txt")
debería abrir un editor de texto. Consulte también "iniciar el segundo programa completamente solo, como si acabara de hacer doble clic en él".os.startfile('path\to\textfile.txt')
Python consume las citas más externas y el shell de Windows no lo ve. Como se mencionó anteriormente, Windows solo entiende comillas dobles. Python convertirá barras diagonales en barras diagonales en Windows, por lo que puede usar
Python consume el ', que luego pasa "C: //Temp/abc/Notepad.exe" (como una ruta de Windows, no se necesitan barras invertidas dobles) a CMD.EXE
fuente
os.system('curl URL > file')
donde quiero ver la actualización del medidor de progreso de cURL para archivos realmente grandes.\t
,\n
, etc), entonces esa particular barra invertida debe ser duplicado. Ser una ruta de Windows no tiene nada que ver con eso.os.system()
Windows, la ventana cmd se abrirá y permanecerá abierta hasta que cierre el proceso que comenzó. En mi humilde opinión es mejor usaros.startfile()
.import os
Al menos en Windows 7 y Python 3.1,
os.system
en Windows quiere que la línea de comando se doble entre comillas si hay espacios en la ruta del comando. Por ejemplo:Un ejemplo del mundo real que me estaba confundiendo era clonar una unidad en VirtualBox. La
subprocess.call
solución anterior no funcionó debido a un problema de derechos de acceso, pero cuando hice una doble cita del comando, meos.system
alegré:fuente
subprocess
, pero a vecesos.system
yos.popen(...).read()
son más rápidos de escribir. Por cierto, no necesita escapar de las comillas dobles dentro de simple, es decir,'""C:\\Temp\\a b c\\Notepad.exe""'
lo hará.fuente
Para python> = 3.5
subprocess.run
debe usarse en lugar desubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
fuente
Sospecho que es el mismo problema que cuando usas accesos directos en Windows ... Prueba esto:
fuente
Supongamos que queremos ejecutar su servidor web Django (en Linux) que hay espacio entre su ruta (ruta =
'/home/<you>/<first-path-section> <second-path-section>'
), así que haga lo siguiente:[ Nota ]:
chmod 755 -R <'yor path'>
manage.py
es excelente:chmod +x manage.py
fuente
Para Python 3.7, use subprocess.call . Use una cadena sin formato para simplificar las rutas de Windows:
fuente
No hay necesidad de subproceso, simplemente se puede lograr mediante
GitPath = "C: \ Archivos de programa \ Git \ git-bash.exe" # Ruta del archivo de aplicación en mycase su archivo GITBASH os.startfile (GitPath)
fuente