web-dev-qa-db-fra.com

Identifier la relation de dépendance pour les packages python installés avec pip

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.

99
Mark Chackerian

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]
111
djsutho

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

63
BernardoFire

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:

  • Vous pouvez avoir un requirements.raw propre avec un contrôle de version pour reconstruire votre requirements.txt complet.
  • Méfiez-vous des urls git remplacées par des noms d'oeufs dans le processus.
  • Les dépendances de vos dépendances sont toujours triées par ordre alphabétique, vous ne savez donc pas directement lequel était requis par quel package, mais vous n'en avez pas vraiment besoin.
  • Utilisez pip install --no-install <package_name> pour répertorier les exigences spécifiques.
  • Utilisez virtualenv si vous ne le faites pas.
12
Maxime R.

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
5
biophetik

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.

3
Mariusz Jamro

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)))
1
Six

(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.

  1. notant où mes paquets de site ont été mis.

  2. 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/
0
JL Peyret