Я пытаюсь создать список требований с локального неустановленного колеса. Просто получить список, который был подан как параметр packages
в setup.py
setuptools.setup
-call, был бы оптимальным. Результат работы, который может быть pip freeze
пипетки, если колесо будет установлено, тоже может работать.
Я хочу создать образ докера, который будет использоваться в цепочке CI. Чтобы сократить время конвейера, оно должно быть загружено с использованием всех зависимостей во время выполнения. Но в том месте, где построено изображение, пакет python еще не построен, и создание пакета за пределами цепочки просто для получения requirements.txt
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
Это не очень хорошо, потому что докер делает странные вещи со своим контекстом сборки. Наличие какого-либо кода в файле setup.py
который обращается к локальным файлам (например, извлечение текущего номера версии из файла VERSION
), нарушает этот хак.
Исправление контекста docker-build, чтобы этот код работал, решит мою проблему, но я предпочел бы правильное решение, которое не подразумевает, что он будет выглядеть в setup.py
.
Использование pip/pipreqs/pipenv/pipdeptree:
Все эти инструменты работают поверх локальных сред и не могут обрабатывать удаленное колесо. Этот ответ довольно близок с использованием pip
, но 1) работает только в том случае, если пакет загружен в pyPI (которого нет у моего целевого пакета) и 2) делает массивную сухую сборку, чтобы получить список пакетов.
Отъезд johnnydep
.
pip install johnnydep
johnnydep your-wheel-file.whl --output-format=pinned
Демо-версия:
$ johnnydep johnnydep-0.5-py2.py3-none-any.whl --output-format pinned
johnnydep==0.5
anytree==2.4.3
cachetools==2.1.0
colorama==0.3.9
oyaml==0.7
packaging==18.0
pip==18.0
pkginfo==1.4.2
pytoml==0.1.19
setuptools==40.4.3
structlog==18.2.0
tabulate==0.8.2
wheel==0.32.1
wimpy==0.4
six==1.11.0
pyyaml==3.13
pyparsing==2.2.2