español - ¿Cómo ejecuto un programa desde Python? os.system falla debido a espacios en la ruta
subprocess python español (8)
Al menos en Windows 7 y Python 3.1, os.system
en Windows quiere que la línea de comandos se doble entre comillas si hay espacios en la ruta del comando. Por ejemplo:
TheCommand = ''/"/"C://Temp//a b c//Notepad.exe/"/"''
os.system(TheCommand)
Un ejemplo del mundo real que me estaba impidiendo era clonar una unidad en VirtualBox. La solución subprocess.call
anterior no funcionó debido a algún problema de derechos de acceso, pero cuando os.system
el comando, os.system
se alegró:
TheCommand = ''/"/"C://Program Files//Sun//VirtualBox//VBoxManage.exe/" '' /
+ '' clonehd /"'' + OrigFile + ''/" /"'' + NewFile + ''/"/"''
os.system(TheCommand)
Tengo un script en 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, un programa ejecutable o un archivo por lotes.
Si me 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 de nuevo:
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 se cierra, pero necesito esperar a que se complete.
También tenga en cuenta que 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
La sintaxis de nombre de archivo, nombre de directorio o etiqueta de volumen es incorrecta.
Aquí hay una forma diferente de hacerlo.
Si está utilizando Windows, lo siguiente es hacer doble clic en el archivo en el Explorador o dar el nombre del archivo como un argumento al comando de "inicio" de DOS: el archivo se abre con cualquier aplicación (si existe) con la que esté asociada la extensión. .
filepath = ''textfile.txt''
import os
os.startfile(filepath)
Ejemplo:
import os
os.startfile(''textfile.txt'')
Esto abrirá textfile.txt con el Bloc de notas si el Bloc de notas está asociado con archivos .txt.
Las citas más externas son consumidas por Python, y el shell de Windows no lo ve. Como se mencionó anteriormente, Windows solo entiende las comillas dobles. Python convertirá la barra inclinada hacia adelante en barras invertidas en Windows, por lo que puede usar
os.system(''"C://Temp/a b c/Notepad.exe"'')
Python consume el '''', que luego pasa "C: //Temp/abc/Notepad.exe" (como una ruta de Windows, no se necesitan doble barras invertidas) a CMD.EXE
Para python> = 3.5 subprocess.run
debe usarse en lugar de subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run([''notepad.exe'', ''test.txt''])
Sospecho que es el mismo problema que cuando usas accesos directos en Windows ... Prueba esto:
import os;
os.system("/"C://Temp//a b c//Notepad.exe/" C://test.txt");
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 el seguimiento:
import subprocess
args = [''{}/manage.py''.format(''/home/<you>/<first-path-section> <second-path-section>''), ''runserver'']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[ Nota ]:
- No olvide el permiso de acceso:
chmod 755 -R <''yor path''>
-
manage.py
es exceutable:chmod +x manage.py
subprocess.call
evitará problemas al tener que lidiar con citas de convenciones de varios shells. Acepta una lista, en lugar de una cadena, por lo que los argumentos se delimitan más fácilmente. es decir
import subprocess
subprocess.call([''C://Temp//a b c//Notepad.exe'', ''C://test.txt''])
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec(''NOTEPAD.exe'') # Works seamlessly
except: pass