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'