Как получить местоположение установленного пакета Python в оболочке

#python #docker-compose

#python #docker-compose

Вопрос:

Я хочу, чтобы мои пользователи могли ссылаться на файл в моем пакете python (в частности, на файл docker-compose.yml) непосредственно из оболочки.

Я не смог найти способ получить только местоположение из pip show (и выделение «местоположения» из его вывода выглядит уродливо), поэтому мое текущее (несколько подробное) решение:

 docker compose -f $(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")/timescale/docker-compose.yml up
 

Есть ли лучший способ?

Редактировать: я решил это, установив команду-оболочку, которую я вызываю locust-compose как часть пакета. Не идеально, но оно выполняет свою работу:

 #!/bin/bash
module_location=$(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")
set -x
docker compose -f $module_location/timescale/docker-compose.yml "$@"
 

Ответ №1:

Большая часть поддержки, которая вам нужна для этого, находится в core setuptools suite.

Прежде всего, вам нужно убедиться, что файл данных включен в ваш пакет. В setup.cfg файле вы можете записать:

 [options.package_data]
timescale = docker-compose.yml
 

Теперь, если вы pip install . или pip wheel , это будет включать файл Compose как часть пакета Python.

Затем вы можете получить это в коде Python с помощью ResourceManager API:

 #!/usr/bin/env python3
# timescale/compose_path.py

import pkg_resources

if __name__ == '__main__':
  print(pkg_resources.resource_filename('timescale', 'docker-compose.yml'))
 

И, наконец, вы можете взять этот скрипт и сделать его сценарием точки входа setuptools (в отличие от концепции Docker с аналогичным именем), чтобы вы могли просто запустить его как одну команду.

 [options.entry_points]
console_scripts=
  timescale_compose_path = timescale:compose_path
 

Опять же, если вы pip install . находитесь в виртуальной среде, вы должны иметь возможность запустить timescale_compose_path и получить имя пути.

Выполнив все эти шаги, вы, наконец, можете запустить более простой

 docker-compose -f $(timescale_compose_path) up
 

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

1. Приятно! У меня уже были первые части (хотя я использую MANIFEST.in чтобы включить файл в мой пакет). Я не хочу заставлять своих пользователей запускать virtualenv, поэтому, к сожалению, я не думаю, что смогу использовать ваш подход.

2. Или подождите, может быть, ваше решение действительно не требует virtualenv? Если это так, это очень похоже на мое решение и, возможно, даже лучше. В любом случае, оба наших решения являются более обходными путями того, что я чувствую (желаю), было более простым решением.

3. Для этого не должна специально требоваться виртуальная среда, но для этого требуется, чтобы пакет действительно был установлен с использованием обычных инструментов.