Как создается команда и добавляется к пути в репозитории python - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над git репо https://opendev.org/airship/promenade, он создает набережную изображения на основе python изображения. внутри образа он создает исполняемый файл / usr / local / bin / promenade, который представляет собой сценарий python и является основной командой, по которой запускается образ. Я хочу понять, как этот образ добавил / usr / local / bin / promenade в качестве исполняемого файла и как он вызывает другие модули, любая помощь будет оценена, я прошел через все основы setup.py и pip install, но не мог понять этого

1 Ответ

1 голос
/ 08 мая 2020

Очень типичная настройка для Docker контейнеров - использовать собственные инструменты упаковки языковой среды выполнения, а затем выполнить минимум, необходимый в Dockerfile для установки приложения с его использованием. Вот что здесь происходит.

Ядро среды упаковки Python - это сценарий setup.py, который описывает, как установить пакет. В этом репозитории setup.py использует пакет с именем pbr , который перемещает большую часть настройки в файл конфигурации без кода, setup.cfg. Он содержит блок:

[entry_points]
console_scripts =
    promenade=promenade.cli:promenade

console_scripts является стандартной частью библиотеки Python setuptools. Когда вы запускаете pip install (или ./setup.py install), он создает сценарий оболочки с именем promenade в каталоге bin текущей установки. Этот сценарий просто запускает Python, импортирует модуль promenade.cli и вызывает в нем функцию promenade().

Если у вас есть локальная проверка этого, вы можете увидеть это, используя виртуальный Python environment:

# Create a new virtual environment
python3 -m venv venv

# Install this package in that virtual environment
./venv/bin/pip install .

# See the new wrapper script
ls -l ./venv/bin/promenade

В контексте Docker вы обычно не используете виртуальную среду: образ Docker изолирован от хост-системы, и обычно только одно приложение устанавливается в образ, поэтому конфликтов не будет, если вы используете "системный" python. Dockerfile в этом репозитории на самом деле просто запускает pip:

COPY . /opt/promenade
RUN pip install -e /opt/promenade

В отсутствие виртуальной среды pip install для системы python обычно устанавливает эти консольные скрипты в /usr/local/bin, поэтому последняя строка создаст оболочку /usr/local/bin/promenade.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...