Como faço para executar um programa do Python? o.falha do sistema devido aos espaços em path

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();

então falha com o seguinte erro:

"C:\Temp\a' não é reconhecido como um comando interno ou externo, programa operacional 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 deixa de funcionar novamente:

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

Qual é o a maneira certa de executar um programa e esperar que ele termine? Eu não preciso ler a saída dele, porque é um programa visual que faz um trabalho e então apenas sai, Mas eu preciso esperar por ele para completar.

note também, 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();

repare nas aspas simples e duplas trocadas.

com ou sem um parâmetro para o bloco de notas aqui, ele falha com a mensagem de erro

o nome do ficheiro, o nome da pasta ou a sintaxe do rótulo do volume está incorrecta.

Author: Peter Mortensen, 2008-10-15

8 answers

subprocess.call evitará problemas em ter que lidar com a citação de Convenções de várias conchas. Ele aceita uma lista, ao invés de uma cadeia de caracteres, 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'])
 256
Author: Brian, 2012-12-19 12:07:39
Eis uma maneira diferente de o fazer.

Se estiver a usar o Windows, o seguinte actua como se fizesse duplo-click no ficheiro in Explorer, ou se desse o nome do ficheiro como argumento para o comando dos "start": o ficheiro é aberto com qualquer aplicação (se existir) com a qual a sua extensão esteja associada.

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

Exemplo:

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

Isto irá abrir o ficheiro de texto.txt com o Notepad se o Notepad estiver associado .ficheiros txt.

 58
Author: user16738, 2018-01-17 20:24:23

As aspas mais exteriores são consumidas pelo próprio Python, e a shell do Windows não a vê. Como mencionado acima, o Windows só compreende aspas duplas. O Python irá converter a barra invertida para barras invertidas no Windows, para que possa usar o

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

O ' é consumido por Python, que depois passa "C://Temp/a b c / Notepad.exe " (como um caminho para o Windows, sem necessidade de barras duplas) para CMD.EXE

 31
Author: Daniel Serodio, 2015-06-28 19:01:00

Pelo menos no Windows 7 e no Python 3.1, os.system no Windows quer a linha de comandos duplamente citada se existirem espaços a seguir ao comando. Por exemplo:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)
Um exemplo do mundo real que me surpreendeu foi a clonagem de um disco na VirtualBox. A solução acima não funcionou por causa de alguns direitos de acesso, mas quando eu citei o comando, os.system ficou feliz:
  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)
 16
Author: Paul Hoffman, 2016-10-21 16:36:43
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
 7
Author: rahul, 2012-03-27 22:23:22
Suspeito que seja o mesmo problema de usar atalhos no Windows... Tente isto:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
 4
Author: Matthew Scharley, 2008-10-15 09:16:54

Para python > = 3, 5 subprocess.run deve ser usado em vez de subprocess.call

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

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
 2
Author: gbonetti, 2018-01-22 13:16:24

Suponha que queremos executar o seu servidor Web Django (em Linux) que existe espaço entre o seu caminho (path='/home/<you>/<first-path-section> <second-path-section>'), assim como 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 te esqueças de aceder à permissão.
  • manage.py é excepcional: chmod +x manage.py
 0
Author: Benyamin Jafari, 2018-09-20 19:54:10