Я получаю следующую ошибку:
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
in * 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», если я доверяю этой команде. Тогда все идет хорошо.