Como posso executar um programa a partir do Python? os.system falha devido a espaços no caminho

Eu tenho um script Python que precisa executar um programa externo, mas por alguma razão falha.

Se eu tiver o seguinte guião:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

Depois falha com o seguinte erro:

'C:\Temp\a' não é reconhecido como um comando interno ou externo, programa operável ou arquivo de lote.

Se eu escapar ao programa com citações:

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

Então funciona. No entanto, se eu adicionar um parâmetro, ele pára de funcionar novamente:

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

Qual é a forma correta de executar um programa e esperar que ele seja concluído? Eu não preciso ler a saída dele, pois é um programa visual que faz um trabalho e depois apenas sai, mas preciso esperar que ele termine.

Note também que mover o programa para um caminho não espaçado também não é uma opção.


Isto também não funciona:

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

Note as aspas simples/duplas trocadas.

Com ou sem um parâmetro para o Bloco de Notas aqui, ele falha com a mensagem de erro

O nome do arquivo, nome do diretório ou sintaxe da etiqueta do volume está incorreta.

Solução

O subprocess.call evitará problemas em ter que lidar com convenções de citação de vários shells. Ele aceita uma lista, ao invés de uma string, então os argumentos são mais facilmente delimitados, ou seja

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

Aqui'é uma maneira diferente de o fazer.

Se você're usa Windows, o seguinte age como clicar duas vezes no arquivo no Explorer, ou dar o nome do arquivo como argumento ao DOS "start" comando: o arquivo é aberto com qualquer aplicação (se houver) a sua extensão está associada.

filepath = 'textfile.txt'
import os
os.startfile(filepath)

Exemplo:

import os
os.startfile('textfile.txt')

Isto abrirá o arquivo texto.txt com o Notepad se o Notepad estiver associado a arquivos .txt.

Comentários (3)

Suspeito que é o mesmo problema que quando se usa atalhos no Windows... Tente isto:

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