Я отримую таку помилку:
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", якщо я довіряю цій команді. Тоді це добре працює.