Eu estou recebendo o seguinte erro:
WindowsError: [Error 2] The system cannot find the file specified
Meu código é:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7 de 64 bits. Python 3.x mais recente, estável.
Alguma ideia?
Obrigado,
python
path
python-3.x
Sri
fonte
fonte
Respostas:
Quando o comando é um shell embutido, adicione 'shell = True' à chamada.
Por exemplo, para
dir
você digitaria:Para citar a documentação:
fonte
dir.exe
enquanto houver um/bin/ls
in * nix.dir
é implementado por CMD.EXE muito comocd
é implementado pela festa .PATH
doos.environ
e pesquisá-lo manualmente.No Windows, acredito que o
subprocess
módulo não fica no aPATH
menos que você passeshell=True
porque ele usaCreateProcess()
nos bastidores. No entanto,shell=True
pode ser um risco de segurança se você passar argumentos que podem vir de fora do seu programa. Para tornar,subprocess
no entanto, capaz de encontrar o executável correto, você pode usarshutil.which
. Suponha que o executável em seuPATH
seja denominadofrob
:(Isso funciona no Python 3.3 e superior.)
fonte
No Windows, você deve chamar por meio do cmd.exe. Como Apalala mencionou, os comandos do Windows são implementados em cmd.exe não como executáveis separados.
por exemplo
/ c diz ao cmd para executar o comando a seguir
Isso é mais seguro do que usar shell = True, que permite injeções de shell.
fonte
/k
vez de/c
. Digitecmd /?
na linha de comando para obter detalhes.Se você estiver usando o PowerShell, então estará
subprocess.call(['powershell','-command','dir'])
. O Powershell suporta uma grande parte dos comandos POSIXfonte
Depois de muito questionar, descobri que executar um arquivo localizado em C: \ Windows \ System32 \ enquanto uma versão de 32 bits do python em uma máquina de 64 bits é um problema potencial, porque o Windows está tentando superar o processo, e redirecionar chamadas para C: \ Windows \ System32 para C: \ Windows \ SysWOW64.
Encontrei um exemplo de como corrigir isso aqui: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
fonte
Para citar a documentação:
"Antes do Python 3.5, essas três funções compreendiam a API de alto nível para subprocessar. Agora você pode usar run () em muitos casos, mas muitos códigos existentes chamam essas funções."
SO: em vez de subprocess.call, use subprocess.run para Python 3.5 e superior
fonte
Eu encontrei o mesmo problema enquanto chamava um PHP. A razão é que o PHP não está no PATH, então o comando PHP não foi encontrado. Mas o PowerShell descobriu que ele existe no local atual e sugere a substituição de 'PHP' por '. \ PHP' se eu confiar neste comando. Então funciona bem.
fonte