Eu tenho um script Python que precisa executar um programa externo, mas por algum motivo falha.
Se eu tiver o seguinte script:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Em seguida, falha com o seguinte erro:
'C: \ Temp \ a' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.
Se eu escapar do programa com aspas:
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 deixará de funcionar novamente:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Qual é a maneira correta de executar um programa e esperar que ele seja concluído? Não preciso ler a saída dele, pois é um programa visual que faz um trabalho e depois sai, mas preciso aguardar a conclusão.
Observe também que mover o programa para um caminho não espaçado também não é uma opção.
Isso também não funciona:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Observe 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 do rótulo do volume está incorreto.
fonte
os.system(r'C:\temp\"a b c"\Notepad.exe')
ou esta: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"
. Em Python, torna-se:["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Respostas:
subprocess.call
evitará problemas em ter que lidar com convenções de cotação de várias conchas. Ele aceita uma lista, em vez de uma sequência, para que os argumentos sejam mais facilmente delimitados. iefonte
subprocess.call
deve ser substituído porsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiAqui está uma maneira diferente de fazer isso.
Se você estiver usando o Windows, as seguintes ações funcionam como clicar duas vezes no arquivo no Explorer ou fornecer o nome do arquivo como argumento para o comando "start" do DOS: o arquivo é aberto com qualquer aplicativo (se houver) ao qual sua extensão está associada .
Exemplo:
Isso abrirá o textfile.txt com o Bloco de Notas se o Bloco de Notas estiver associado aos arquivos .txt.
fonte
webbrowser.open("textfile.txt")
ele deve abrir um editor de texto. Veja também "inicie o segundo programa por si só, como se eu tivesse apenas 'clicado duas vezes nele'".os.startfile('path\to\textfile.txt')
As aspas mais externas são consumidas pelo próprio Python e o shell do Windows não o vê. Como mencionado acima, o Windows entende apenas aspas duplas. O Python converterá barras invertidas em barras invertidas no Windows, para que você possa usar
O 'é consumido pelo Python, que passa "C: //Temp/abc/Notepad.exe" (como um caminho do Windows, não são necessárias duas barras invertidas) para o CMD.EXE
fonte
os.system('curl URL > file')
local em que eu quero ver a atualização do medidor de progresso do cURL para arquivos realmente grandes.\t
,\n
, etc.), então, que determinado barra invertida deve ser duplicada. Ser um caminho do Windows não tem nada a ver com isso.os.system()
no Windows, a janela cmd será aberta e permanecerá aberta até você fechar o processo iniciado. IMHO é melhor usaros.startfile()
.import os
Pelo menos no Windows 7 e Python 3.1,
os.system
no Windows deseja que a linha de comando entre aspas duplas se houver espaços no caminho para o comando. Por exemplo:Um exemplo do mundo real que estava me surpreendendo foi a clonagem de uma unidade no VirtualBox. A
subprocess.call
solução acima não funcionou devido a algum problema de direitos de acesso, mas quando citei duas vezes o comando,os.system
fiquei feliz:fonte
subprocess
, mas às vezesos.system
eos.popen(...).read()
são apenas mais rápidos para digitar. BTW, você não precisa escapar de aspas duplas em single, ou seja'""C:\\Temp\\a b c\\Notepad.exe""'
, fará.fonte
Para python> = 3.5
subprocess.run
deve ser usado no lugar desubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
fonte
Eu suspeito que é o mesmo problema que quando você usa atalhos no Windows ... Tente o seguinte:
fonte
Suponha que desejamos executar o servidor da web do Django (no Linux) que exista espaço entre o seu caminho (path =
'/home/<you>/<first-path-section> <second-path-section>'
), faça o seguinte:[ Nota ]:
chmod 755 -R <'yor path'>
manage.py
é excedable:chmod +x manage.py
fonte
Para Python 3.7, use subprocess.call . Use a sequência bruta para simplificar os caminhos do Windows:
fonte
Não há necessidade de subprocesso, pode ser alcançado simplesmente por
GitPath = "C: \ Arquivos de programas \ Git \ git-bash.exe" # Caminho do arquivo do aplicativo no mycase, seu GITBASH os.startfile (GitPath)
fonte