Создайте файл require.txt из неустановленного колеса

1

Я пытаюсь создать список требований с локального неустановленного колеса. Просто получить список, который был подан как параметр 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) делает массивную сухую сборку, чтобы получить список пакетов.

Теги:
docker
continuous-integration
python-packaging

1 ответ

1
Лучший ответ

Отъезд 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню