¿Cómo puedo ejecutar un programa desde Python? os.system falla debido a los espacios en la ruta

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, programa operable 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 añado 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 la salida del mismo, ya que es un programa visual que hace un trabajo y luego simplemente sale, pero necesito esperar a que se complete.

También hay que tener 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();

Observe 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 del nombre del archivo, del nombre del directorio o de la etiqueta del volumen es incorrecta.

Solución

subprocess.call evitará los problemas de tener que lidiar con las convenciones de citación de varios shells. Acepta una lista, en lugar de una cadena, por lo que los argumentos son más fáciles de delimitar.

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Comentarios (9)

Esta es una forma diferente de hacerlo.

Si utiliza Windows, lo siguiente actúa como si hiciera doble clic en el archivo en el Explorador, o diera el nombre del archivo como argumento al comando DOS "start": el archivo se abre con la aplicación (si la hay) a la que está asociada su 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 los archivos .txt.

Comentarios (3)

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

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Comentarios (4)