У меня есть файл колеса Python: psutil-5.4.5-cp26-none-linux_x86_64.whl
Как я могу перечислить зависимости этого колеса?
У меня есть файл колеса Python: psutil-5.4.5-cp26-none-linux_x86_64.whl
Как я могу перечислить зависимости этого колеса?
Как упоминалось ранее, файлы .whl
являются просто ZIP-архивами. Вы можете просто открыть их и покопаться в файле METADATA
.
Однако есть инструмент, который может немного облегчить этот ручной процесс. Вы можете использовать pkginfo, который можно установить с помощью pip.
Использование CLI:
$ pip install pkginfo
$ pkginfo -f requires_dist psutil-5.4.5-cp27-none-win32.whl
requires_dist: ["enum34; extra == 'enum'"]
Использование API:
>>> import pkginfo
>>> wheel_fname = "psutil-5.4.5-cp27-none-win32.whl"
>>> metadata = pkginfo.get_metadata(wheel_fname)
>>> metadata.requires_dist
[u"enum34 ; extra == 'enum'"]
Я просто пытался распаковать (не gunzip) колесо, которое я лежал. Файл packagename-version.dist-info/METADATA
содержит список записей Requires-Dist:
которые содержат скомпилированные требования из setup.py
.
Вы можете установить файл колес в отдельной виртуальной среде, а затем посмотреть, какие все остальные пакеты установлены.
Здесь минимальный фрагмент, который не требует, чтобы у вас был внешний инструмент (unzip, gzip или similars), поэтому он должен работать как в * nix/windows:
wheeldeps.py:
import argparse
from zipfile import ZipFile
parser = argparse.ArgumentParser()
parser.add_argument('filename')
args = parser.parse_args()
archive = ZipFile(args.filename)
for f in archive.namelist():
if f.endswith("METADATA"):
for l in archive.open(f).read().decode("utf-8").split("\n"):
if 'requires-dist' in l.lower():
print(l)
Пример:
> python wheeldeps.py psutil-5.4.5-cp27-cp27m-win_amd64.whl
Requires-Dist: enum34; extra == 'enum'
Это сообщение, которое я нашел где-то. Я скопировал все и отправил по электронной почте, поэтому у меня нет источника для ответа, но я думаю, что это может помочь. Если кто-нибудь знает источник, я удалю это сообщение и свяжу его с этим сообщением.
Installation
$ pip install --upgrade pip # pip-tools needs pip==6.1 or higher (!)
$ pip install pip-tools
Example usage for pip-compile
Suppose you have a Flask project, and want to pin it for production. Write the following line to a file:
# requirements.in
Flask
Now, run pip-compile requirements.in:
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
# pip-compile requirements.in
#
flask==0.10.1
itsdangerous==0.24 # via flask
jinja2==2.7.3 # via flask
markupsafe==0.23 # via jinja2
werkzeug==0.10.4 # via flask
And it will produce your requirements.txt, with all the Flask dependencies (and all underlying dependencies) pinned. Put this file under version control as well and periodically re-run pip-compile to update the packages.
Example usage for pip-sync
Now that you have a requirements.txt, you can use pip-sync to update your virtual env to reflect exactly what in there. Note: this will install/upgrade/uninstall everything necessary to match the requirements.txt contents.
$ pip-sync
Uninstalling flake8-2.4.1:
Successfully uninstalled flake8-2.4.1
Collecting click==4.1
Downloading click-4.1-py2.py3-none-any.whl (62kB)
100% |████████████████████████████████| 65kB 1.8MB/s
Found existing installation: click 4.0
Uninstalling click-4.0:
Successfully uninstalled click-4.0
Successfully installed click-4.1
Требование.txt будет иметь все необходимое для пакета.
Я использую, чтобы установить мои виртуальные envs с pipenv
который устанавливает pew
как требование. pew
позволяет устанавливать временные виртуальные среды, которые удаляются при exit
этих специальных виртуальных сред. Так...
Создайте новую пустую виртуальную среду и активируйте ее "на лету":
pew mktmpenv -p/usr/bin/python3.6
Установите пакет:
pip install somedistro
Посмотрите, каковы требования вашего дистрибутива (а также требования требований...):
pip list
Отключите и удалите временную среду.
exit
Кроме того, временные виртуальные среды очень полезны при тестировании упаковки.
Общий ответ, в unix: используйте strace
Найти pid:
ps -C psutil
// Output example 1337
Все в процессах
sudo strace -p 1337
Только зависимости процесса Strace:
sudo strace -f -e open -p 1337