import shutil shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
cmd - str, исполняемый файл.mode=os.F_OK | os.X_OK - маска прав файла cmd,path=None - переменная среды окружения.str, путь к исполняемому файлу cmd.Функция which() модуля shutil возвращает путь к исполняемому файлу, который будет запущен, если будет вызван данный cmd. Если никакая команда не будет вызвана, вернет None.
Аргумент mode - это маска прав, переданная в функции os.access(), по умолчанию определяющая, существует ли файл и является ли он исполняемым.
Если путь path не указан, то используются результаты os.environ(), возвращающие либо значение PATH, либо откат к os.defpath.
Изменено в Python 3.12: В Windows текущий каталог больше не добавляется к пути поиска, если
modeвключаетos.X_OKи WinAPI требуется, чтобы значениеcurrentdirectoryforexepathw(cmd)было равноfalse, иначе добавляется текущий каталог, даже если он уже есть в пути поиска.PATHEXTтеперь используется, даже еслиcmdвключает компонент каталога или заканчивается расширением, указанным вPATHEXTи теперь можно найти имена файлов, у которых нет расширения.
Изменено в Python 3.12.1: В Windows, если
modeвключаетos.X_OK, исполняемые файлы с расширением вPATHEXTбудут предпочтительнее исполняемых файлов без соответствующего расширения. Это приближает поведение к поведению Python 3.11.
В Windows текущий каталог добавляется к пути, если mode не включает os.X_OK. Когда mode действительно включает os.X_OK, то будет проведен опрос Windows API NeedCurrentDirectoryForExePathW, чтобы определить, следует ли добавлять текущий каталог к path. Чтобы избежать обращения к текущему рабочему каталогу для поиска исполняемых файлов: необходимо установить переменную окружения NoDefaultCurrentDirectoryInExePath.
Также в Windows переменная PATHEXT используется для разрешения команд, которые, возможно, еще не содержат расширения. Например, если вызывается shutil.which("python"), то функция будет искать PATHEXT, чтобы искать python.exe внутри каталогов path.
Например, в Windows:
>>> import shutil >>> shutil.which("python") # 'C:\\Python33\\python.EXE'
Также применяется, когда cmd - это путь, содержащий компонент каталога:
>>> import shutil >> shutil.which("C:\\Python33\\python") # 'C:\\Python33\\python.EXE'
# В Unix >>> import shutil >>> shutil.which("python") # '/usr/bin/python'