Lorsque je fais pip piper, je vois un grand nombre de packages Python que je n’ai pas installés explicitement, par exemple.
$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)
Est-il possible pour moi de déterminer pourquoi pip a installé ces packages dépendants? En d'autres termes, comment puis-je déterminer le paquet parent contenant ces paquets en tant que dépendances?
Par exemple, il se peut que je veuille utiliser Twisted et que je ne souhaite pas dépendre d'un paquet avant d'en savoir plus sur sa désinstallation accidentelle ou sa mise à niveau.
Vous pouvez essayer pipdeptree qui affiche les dépendances sous forme d’arborescence, par exemple :
$ pipdeptree
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
- Flask [installed: 0.10.1]
- Werkzeug [required: >=0.7, installed: 0.9.4]
- Jinja2 [required: >=2.4, installed: 2.7.2]
- MarkupSafe [installed: 0.18]
- itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
- SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
- Mako [installed: 0.9.1]
- MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1
Pour le faire fonctionner:
pip install pipdeptree
EDIT: comme noté par @Esteban dans les commentaires, vous pouvez également lister l’arborescence en sens inverse avec -r
ou pour un seul paquet avec -p <package_name>
afin de trouver le type de Werkzeug installé, exécutez-le:
$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
- Flask==0.12 [requires: Werkzeug>=0.7]
La commande pip show
affiche les packages requis pour le package spécifié (notez que le package spécifié doit déjà être installé):
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
pip show
a été introduit dans la version pip 1.4rc5
Comme je l'ai récemment dit sur un thread hn , je vous recommande ce qui suit:
Ayez un fichier commenté requirements.txt
avec vos dépendances principales:
## this is needed for whatever reason
package1
Installez vos dépendances: pip install -r requirements.txt
. Vous obtenez maintenant la liste complète de vos dépendances avec pip freeze -r requirements.txt
:
## this is needed for whatever reason
package1==1.2.3
## The following requirements were added by pip --freeze:
package1-dependency1==1.2.3
package1-dependency1==1.2.3
Cela vous permet de conserver votre structure de fichier avec des commentaires, séparant ainsi bien vos dépendances des dépendances de vos dépendances. De cette façon, vous passerez un temps beaucoup plus agréable le jour où vous devrez en enlever un :)
Notez les points suivants:
requirements.raw
propre avec un contrôle de version pour reconstruire votre requirements.txt
complet.pip install --no-install <package_name>
pour répertorier les exigences spécifiques.Vous pouvez également utiliser une commande d'une ligne qui dirige les packages dans les exigences à afficher.
cut -d'=' -f1 requirements.txt | xargs pip show
Tout d'abord, pip freeze
affiche tous les packages actuellement installés Python, pas nécessairement à l'aide de PIP.
Deuxièmement, les paquets Python contiennent les informations sur les paquets dépendants ainsi que versions requises . Vous pouvez voir les dépendances de pkg particulier en utilisant les méthodes décrites ici . Lorsque vous mettez à niveau un paquet, le script d'installation tel que PIP se chargera de la mise à niveau des dépendances.
Pour résoudre la mise à jour des paquets, je recommande l’utilisation de Fichiers de spécifications PIP . Vous pouvez définir les packages et les versions dont vous avez besoin, et les installer simultanément à l'aide de pip install.
J'ai écrit un script rapide pour résoudre ce problème. Le script suivant affichera le ou les packages parents (dépendants) pour un package donné. De cette façon, vous pouvez être sûr que la mise à jour ou l’installation d’un paquet particulier est sans danger. Il peut être utilisé comme suit: dependants.py PACKAGENAME
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""Find dependants of a Python package"""
import logging
import pip
import pkg_resources
import sys
__program__ = 'dependants.py'
def get_dependants(target_name):
for package in pip.get_installed_distributions():
for requirement_package in package.requires():
requirement_name = requirement_package.project_name
if requirement_name == target_name:
package_name = package.project_name
yield package_name
# configure logging
logging.basicConfig(format='%(levelname)s: %(message)s',
level=logging.INFO)
try:
target_name = sys.argv[1]
except IndexError:
logging.error("missing package name")
sys.exit(1)
try:
pkg_resources.get_distribution(target_name)
except pkg_resources.DistributionNotFound:
logging.error("'%s' is not a valid package", target_name)
sys.exit(1)
print(list(get_dependants(target_name)))
(solution de contournement, pas de réponse vraie)
Avait le même problème, avec LXML pas installer et moi qui veux savoir qui avait besoin de LXML. Pas qui a besoin de lxml . Nous avons fini par contourner le problème par.
notant où mes paquets de site ont été mis.
allez-y et grep récursif pour l'importation (le dernier - grevert-match de grep sert à retirer de la considération les fichiers de lxml).
Oui, pas de réponse quant à l'utilisation de pip pour le faire, mais les suggestions proposées ne m'ont pas apporté de succès, pour une raison quelconque.
site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/