distutils.spawn.find_executable и shutil.который не может найти файл

#python-3.x

#python-3.x

Вопрос:

Мне нужно найти файл, содержащийся в нашем программном обеспечении с помощью python3.

Проблема в том, что исполняемый файл, который можно найти в the bash среде с find помощью command, не может быть найден в zsh среде с python3. Этот файл не находится ни в $PATH , ни os.environ["PATH"] . Я смог найти его только тогда, когда я указал его абсолютный путь в качестве параметра для shutil amp; which .

Однако, поскольку абсолютный путь зависит от пути установки программного обеспечения, он отличается для каждого пользователя. Поэтому я хочу попросить общий метод, который может найти этот возбуждаемый файл, указав только его имя. Большое спасибо!

Ответ №1:

shutil.which Функция использует $PATH переменную для поиска исполняемых файлов. Он работает точно так же, как bash which или command -v .

find Команда использует каталог в качестве входных данных и выполняет рекурсивный поиск внутри этого каталога.

Чтобы выполнить поиск, вам нужно либо добавить каталог, в котором находится ваш исполняемый файл, к вашему текущему ПУТИ, а затем использовать shutil.which для его поиска

 import os
import shutil
os.environ['PATH']  = ':/exe/location'
exec_location = shutil.which('myexe')
 

или используйте функцию, которая работает аналогично find команде :

 from pathlib import Path
from typing import Optional

def find(name: str, location: Path) -> Optional[Path]:
    files = [ f for f in location.rglob('*') if f.is_file()]
    for f in files:
        if f.name == name:
            return f.resolve()
    
    return None
 

Комментарии:

1. Спасибо за ответ. Согласно PEP 632 , distutils устарел с python 3.10, ответ здесь все еще работает.