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 dirte 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.exementre c'è un /bin/ls* nix. dirè implementato da CMD.EXE proprio come cdè implementato da bash .
PATHda os.environe cercarlo manualmente.
Su Windows, credo che il subprocessmodulo non guardi a PATHmeno che tu non lo passishell=True perché viene utilizzato CreateProcess()dietro le quinte. Tuttavia, shell=Truepuò essere un rischio per la sicurezza se stai passando argomenti che potrebbero provenire dall'esterno del tuo programma. Per rendere subprocesscomunque in grado di trovare l'eseguibile corretto, puoi usare shutil.which. Supponiamo che l'eseguibile nel tuo PATHsia 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.
/kinvece 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.