¿Cómo ejecuto un progtwig desde Python? os.system falla debido a espacios en la ruta

Tengo un script en Python que necesita ejecutar un progtwig externo, pero por alguna razón falla.

Si tengo el siguiente script:

import os; os.system("C:\\Temp\\abc\\Notepad.exe"); raw_input(); 

Entonces falla con el siguiente error:

‘C: \ Temp \ a’ no se reconoce como un comando interno o externo, un progtwig ejecutable o un archivo por lotes.

Si me escapo del progtwig con comillas:

 import os; os.system('"C:\\Temp\\abc\\Notepad.exe"'); raw_input(); 

Entonces funciona. Sin embargo, si agrego un parámetro, deja de funcionar de nuevo:

 import os; os.system('"C:\\Temp\\abc\\Notepad.exe" "C:\\test.txt"'); raw_input(); 

¿Cuál es la forma correcta de ejecutar un progtwig y esperar a que se complete? No necesito leer el resultado, ya que es un progtwig visual que hace un trabajo y luego se cierra, pero necesito esperar a que se complete.

También tenga en cuenta que mover el progtwig a una ruta no espaciada tampoco es una opción.


Esto tampoco funciona:

 import os; os.system("'C:\\Temp\\abc\\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 syntax de nombre de archivo, nombre de directorio o etiqueta de volumen es incorrecta.

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\\abc\\Notepad.exe', 'C:\\test.txt']) 

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 corresponde) con la extensión asociada a .

 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/abc/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

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\\abc\\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) 
 import win32api # if active state python is installed or install pywin32 package seperately try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly except: pass 

Sospecho que es el mismo problema que cuando usas accesos directos en Windows … Prueba esto:

 import os; os.system("\"C:\\Temp\\abc\\Notepad.exe\" C:\\test.txt"); 

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']) 

Supongamos que queremos ejecutar su servidor web Django (en Linux) que hay espacio entre su ruta (ruta = '/home// ' ), así que el seguimiento:

 import subprocess args = ['{}/manage.py'.format('/home// '), '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