Я получаю следующую ошибку:
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/lsin * 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. Как упоминалось в Apalala, команды Windows реализованы в cmd.exe, а не как отдельные исполняемые файлы.
например
subprocess.call(['cmd', '/c', 'dir'])
/ c указывает cmd запустить следующую команду
Это безопаснее, чем использование shell = True, которое допускает инъекции оболочки.
/kвместо /c. cmd /?Для получения подробной информации введите в командной строке.
После долгих размышлений я обнаружил, что запуск файла, который находится в 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 () во многих случаях, но многие существующие коды вызывают эти функции».
SO: вместо subprocess.call используйте subprocess.run для Python 3.5 и выше.
Я столкнулся с той же проблемой, когда звонил на PHP. Причина в том, что PHP отсутствует в PATH, поэтому команда PHP не найдена. Но PowerShell обнаружил, что он действительно существует в текущем местоположении, и предлагает заменить «PHP» на «. \ PHP», если я доверяю этой команде. Тогда все идет хорошо.