Como faço para executar um programa de Python? os.system falhar devido a espaços no caminho

StackOverflow https://stackoverflow.com/questions/204017

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um script Python que precisa executar um programa externo, mas por algum motivo falhar.

Se eu tenho o seguinte script:

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

Em seguida, ele falha com o seguinte erro:

'C: \ Temp \ a'. Não é reconhecido como um comando interno ou externo, programa operacional ou ficheiro batch

Se eu escapar o programa com citações:

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

Em seguida, ele 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();

O que é o caminho certo para executar um programa e esperar por ele para completar? Eu não preciso de ler a saída dele, pois é um programa visual que faz um trabalho e então apenas saídas, mas eu preciso esperar por ele para ser concluído.

Também nota, movendo-se o programa para um caminho não-espaçamento não é uma opção.


Isto não quer trabalhar:

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

Observe as aspas simples / duplas trocados.

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 de rótulo de volume está incorreta.

Foi útil?

Solução

subprocess.call vai evitar problemas com ter para lidar com citando convenções de vários conchas. Ele aceita uma lista, em vez de uma string, então argumentos são mais facilmente delimitado. i.

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

Outras dicas

Aqui está uma maneira diferente de fazê-lo.

Se você estiver usando o Windows o seguinte age como um clique duplo no arquivo no Explorer, ou dando o nome do arquivo como um argumento para o DOS "start" comando: o arquivo é aberto com qualquer aplicativo (se houver) a sua extensão está associado.

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

Exemplo:

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

Isto irá abrir textfile.txt com o bloco de notas, se o bloco de notas está associada a arquivos .txt.

As citações ultraperiféricas são consumidos pelo próprio Python, e não o shell do Windows não vê-lo. Como mencionado acima, o Windows só entende aspas. Python irá converter para a frente-cortou para barras invertidas no Windows, assim você pode usar

os.system('"C://Temp/a b c/Notepad.exe"')

A 'é consumida por pitão, que, em seguida, passa "C: // Temp / a b c / Notepad.exe" (como um caminho do Windows, não há duplas invertidas necessário) para CMD.exe

Pelo menos no Windows 7 e Python 3.1, os.system no Windows quer na linha de comando entre aspas , se houver espaços no caminho para o comando. Por exemplo:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

Um exemplo do mundo real que foi stumping me foi clonar uma unidade no VirtualBox. A solução subprocess.call acima não funcionou por causa de algum problema de direitos de acesso, mas quando eu entre aspas o comando, os.system tornou-se feliz:

  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

Eu suspeito que é o mesmo problema que quando você usa atalhos no Windows ... Tente isto:

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

Para pitão> = 3,5 subprocess.run deve ser utilizado em lugar de subprocess.call

https://docs.python.org /3/library/subprocess.html#older-high-level-api

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])

Suponha que deseja executar o seu servidor web Django (em Linux) que não há espaço entre o seu caminho (path = '/home/<you>/<first-path-section> <second-path-section>'), então faça o seguinte:

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 ]:

  • Não se esqueça acesso permissão: chmod 755 -R <'yor path'>
  • manage.py é exceutable: chmod +x manage.py
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top