Я отримую таку помилку:
WindowsError: [Error 2] The system cannot find the file specified
Мій код:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 біт. Python 3.x останній, стабільний.
Якісь ідеї?
Дякую,
Я отримую таку помилку:
WindowsError: [Error 2] The system cannot find the file specified
Мій код:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 біт. Python 3.x останній, стабільний.
Якісь ідеї?
Дякую,
Відповіді:
Коли команда є вбудованою оболонкою, додайте до виклику 'shell = True'.
Наприклад, dirви введете:
import subprocess
subprocess.call('dir', shell=True)
Цитувати з документації:
Єдиний раз, коли вам потрібно вказати shell = True в Windows, це коли команда, яку ви хочете виконати, вбудована в оболонку (наприклад, dir або copy). Вам не потрібна shell = True, щоб запустити пакетний файл або виконаний на основі консолі.
dir.exeпоки є /bin/ls* nix. dirреалізується CMD.EXE так само, як cdреалізується bash .
PATHвід os.environі пошуку вручну.
В Windows, я вважаю, що subprocessмодуль не виглядає, PATHякщо ви не переходите,shell=True тому що він використовується CreateProcess()поза кадром. Однак це shell=Trueможе бути ризиком для безпеки, якщо ви передаєте аргументи, які можуть виходити за межі вашої програми. Щоб subprocessвсе-таки змогти знайти правильний виконуваний файл, ви можете використовувати shutil.which. Припустимо, виконуваний файл у вашому PATHімені frob:
subprocess.call([shutil.which('frob'), arg1, arg2])
(Це працює на Python 3.3 і вище.)
У Windows вам потрібно зателефонувати через cmd.exe. Як згадував Апалала, команди Windows реалізуються в cmd.exe не як окремі виконувані файли.
напр
subprocess.call(['cmd', '/c', 'dir'])
/ c вказує cmd виконати команду follow
Це безпечніше, ніж використання shell = True, що дозволяє вводити оболонки.
/kзамість цього /c. Введіть cmd /?у командному рядку деталі.
Якщо ви використовуєте powershell, то в ньому буде subprocess.call(['powershell','-command','dir']). Powershell підтримує велику частину команд POSIX
Після багатого чесання голови я виявив, що запуск файлу, який знаходиться в C: \ Windows \ System32 \ під час запуску 32-бітної версії python на 64-бітній машині, є потенційною проблемою, оскільки Windows намагається переохолодити процес, і переадресація викликів на C: \ Windows \ System32 на C: \ Windows \ SysWOW64.
Я знайшов приклад, як це виправити тут: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
Цитувати з документації:
"До Python 3.5, ці три функції містили API високого рівня для підпроцесу. Тепер ви можете використовувати run () у багатьох випадках, але багато існуючих код викликає ці функції."
ТАК: замість subprocess.call використовуйте subprocess.run для Python 3.5 і вище
Я зіткнувся з тією ж проблемою, коли я телефонував PHP. Причина в тому, що PHP не в PATH, тому команда PHP не знайдена. Але PowerShell виявив, що він існує в поточному місці, і він пропонує замінити "PHP" на ". \ PHP", якщо я довіряю цій команді. Тоді це добре працює.