Я пытаюсь создать список требований из локального неустановленного колеса.Было бы просто получить список, который был передан в качестве параметра packages
в setuptools.setup
-call setup.py
.Вывод, который pip freeze
сгенерирует, если колесо будет установлено, тоже может работать.
Чуть больше контекста
Я хочу создать образ докера, который будет использоватьсяв цепи CI.Чтобы сократить время конвейера, он должен быть загружен заранее всеми зависимостями времени выполнения.Но в тот момент, когда образ создается, пакет python еще не собран, и сборка пакета вне цепочки просто для получения requirements.txt
является громоздкой и подверженной ошибкам.
То, что я пробовал
Взломать его в Dockerfile :
python -c $'\
import setuptools\n\
setuptools.setup = lambda *args, **kwargs: None\n\
exec(compile(open("setup.py").read(), "setup.py", "exec"))\n\
for requirement in requirements: print(requirement)\n' > python_packages.txt
# `requirements` is the name of variable that holds the package list
Это не очень хорошо работает, потому что Docker делает странные вещи со своим контекстом сборки.Наличие любого кода в setup.py
, обращающегося к локальным файлам (например, например, выбор номера текущей версии из файла VERSION
), нарушает этот хак.
Исправление контекста сборки docker таким образом, чтобы этот кодРаботы решат мою проблему, но я бы предпочел правильное решение, которое не подразумевает, как вещи выглядят в setup.py
.
Использование pip / pipreqs / pipenv / pipdeptree :
Все эти инструменты работают поверх локальной среды и не могут работать с неустановленным колесом. Этот ответ подходит довольно близко, используя pip
, но 1) работает только в том случае, если пакет загружен в pyPI (что не является моим целевым пакетом), и 2) выполняет здоровенную сухую сборку, чтобы получить пакетсписок.