Windows не может найти файл в subprocess.call () - PullRequest
83 голосов
/ 11 июня 2010

Я получаю следующую ошибку:

WindowsError: [Error 2] The system cannot find the file specified

Мой код:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7, 64 бит.Python 3.x последний, стабильный.

Есть идеи?

Спасибо,

Ответы [ 5 ]

150 голосов
/ 06 января 2011

Когда команда встроена в оболочку, добавьте к вызову 'shell = True'.

Например, для dir вы должны набрать:

import subprocess
subprocess.call('dir', shell=True)

Чтобы процитироватьиз документации:

Единственный раз, когда вам нужно указать shell = True в Windows, это когда команда, которую вы хотите выполнить, встроена в оболочку (например, dir или copy).Вам не нужно shell = True для запуска командного файла или исполняемого файла на консоли.

20 голосов
/ 26 сентября 2015

В Windows я считаю, что модуль subprocess не выглядит в PATH, если вы не передадите shell=True.Однако shell=True может представлять угрозу безопасности, если вы передаете аргументы, которые могут поступать извне вашей программы.Тем не менее, чтобы subprocess смог найти правильный исполняемый файл, вы можете использовать shutil.which.Предположим, исполняемый файл в вашем PATH имеет имя frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(Это работает на Python 3.3 и выше.)

13 голосов
/ 13 сентября 2016

В Windows вам нужно звонить через cmd.exe. Как упомянул Апалала, команды Windows реализованы в cmd.exe, а не в виде отдельных исполняемых файлов.

например.

subprocess.call(['cmd', '/c', 'dir'])

/ c сообщает cmd выполнить следующую команду

Это безопаснее, чем при использовании shell = True, который допускает инъекции оболочки.

2 голосов
/ 24 апреля 2017

Если вы используете powershell, то в нем будет subprocess.call(['powershell','-command','dir']).Powershell поддерживает большую часть команд POSIX

0 голосов
/ 05 марта 2019

Цитируя из документации:

"До Python 3.5 эти три функции составляли высокоуровневый API для подпроцесса. Теперь вы можете использовать run () во многих случаях, но многие существующие коды вызывают ихfunctions. "

SO: вместо subprocess.call используйте subprocess.run для Python 3.5 и выше

...