Ricevo il seguente errore:
WindowsError: [Error 2] The system cannot find the file specified
Il mio codice è:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 bit. Python 3.x più recente, stabile.
Qualche idea?
Grazie,
Ricevo il seguente errore:
WindowsError: [Error 2] The system cannot find the file specified
Il mio codice è:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 bit. Python 3.x più recente, stabile.
Qualche idea?
Grazie,
Risposte:
Quando il comando è un built-in della shell, aggiungi "shell = True" alla chiamata.
Ad esempio per dir
te dovresti digitare:
import subprocess
subprocess.call('dir', shell=True)
Per citare dalla documentazione:
L'unica volta in cui è necessario specificare shell = True su Windows è quando il comando che si desidera eseguire è integrato nella shell (ad esempio dir o copy). Non è necessario shell = True per eseguire un file batch o un eseguibile basato su console.
dir.exe
mentre c'è un /bin/ls
* nix. dir
è implementato da CMD.EXE proprio come cd
è implementato da bash .
PATH
da os.environ
e cercarlo manualmente.
Su Windows, credo che il subprocess
modulo non guardi a PATH
meno che tu non lo passishell=True
perché viene utilizzato CreateProcess()
dietro le quinte. Tuttavia, shell=True
può essere un rischio per la sicurezza se stai passando argomenti che potrebbero provenire dall'esterno del tuo programma. Per rendere subprocess
comunque in grado di trovare l'eseguibile corretto, puoi usare shutil.which
. Supponiamo che l'eseguibile nel tuo PATH
sia denominato frob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(Funziona su Python 3.3 e versioni successive.)
Su Windows devi chiamare tramite cmd.exe. Come accennato da Apalala, i comandi di Windows sono implementati in cmd.exe non come eseguibili separati.
per esempio
subprocess.call(['cmd', '/c', 'dir'])
/ c dice a cmd di eseguire il comando follow
Questo è più sicuro rispetto all'utilizzo di shell = True, che consente iniezioni di shell.
/k
invece di /c
. Immettere cmd /?
nella riga di comando per i dettagli.
Dopo molti grattacapi, ho scoperto che l'esecuzione di un file che si trova in C: \ Windows \ System32 \ mentre si esegue una versione a 32 bit di python su una macchina a 64 bit è un potenziale problema, a causa del tentativo di Windows di superare il processo e reindirizza le chiamate a C: \ Windows \ System32 a C: \ Windows \ SysWOW64.
Ho trovato un esempio di come risolvere questo problema qui: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
Per citare dalla documentazione:
"Prima di Python 3.5, queste tre funzioni comprendevano l'API di alto livello per il sottoprocesso. Ora puoi usare run () in molti casi, ma molto codice esistente chiama queste funzioni."
COSÌ: invece di subprocess.call usa subprocess.run per Python 3.5 e versioni successive
Ho riscontrato lo stesso problema mentre stavo chiamando un PHP. Il motivo è che PHP non è in PATH, quindi il comando PHP non è stato trovato. Ma PowerShell ha scoperto che esiste nella posizione corrente e suggerisce di sostituire "PHP" con ". \ PHP" se mi fido di questo comando. Quindi funziona bene.