确定用pip安装的python软件包的依赖关系

当我做一个点击冻结时,我看到大量的Python包,我没有明确安装,例如

$ 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.) 

有没有办法让我确定为什么pip安装这些特定的依赖包? 换句话说,如何确定将这些包作为依赖关系的父包?

例如,我可能想使用Twisted,并且我不想依赖于一个包,直到我知道更多关于不小心卸载它或升级它。

您可以尝试显示依赖关系的pipdeptree作为树结构,例如:

 $ 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 

要得到它运行:

 pip install pipdeptree 

编辑:正如@Esteban在注释中指出的那样,你也可以使用-r或者使用-p <package_name>软件包名称-p <package_name>反向列出树,以便find你可以运行的安装的Werkzeug:

 $ pipdeptree -r -p Werkzeug Werkzeug==0.11.15 - Flask==0.12 [requires: Werkzeug>=0.7] 

pip show命令将显示指定软件包需要哪些软件包(请注意,指定的软件包必须已经安装):

 $ pip show specloud Package: specloud Version: 0.4.4 Requires: nose figleaf pinocchio 

pip版本是在pip版本1.4rc5中引入的

正如我最近在hn线程中所说的那样,我会build议如下:

有一个注释的requirements.txt文件与您的主要依赖项:

 ## this is needed for whatever reason package1 

安装你的依赖关系: pip install -r requirements.txt 。 现在,您可以使用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 

这使您可以保留文件结构的注释,很好地将您的依赖关系与依赖关系的依赖关系分开。 这样,你将有一个更好的时间,你需要删除其中的一个:)

请注意以下几点:

  • 你可以有一个干净的requirements.raw与版本控制重build您的完整requirements.txt
  • 当心在这个过程中,git urls被蛋名取代。
  • 依赖关系的依赖关系仍然按字母顺序sorting,所以你不直接知道哪个包需要哪个包,但是在这一点上你并不需要它。
  • 使用pip install --no-install <package_name>来列出特定的需求。
  • 如果你没有使用virtualenv 。

您也可以使用一行命令将需求中的软件包pipe道化,以便点击显示。

 cut -d'=' -f1 requirements.txt | xargs pip show 

首先, pip freeze显示所有当前安装的软件包Python,不一定使用PIP。

其次Python包包含了关于相关软件包以及所需版本的信息 。 您可以使用这里描述的方法来查看特定pkg的依赖关系。 升级包时,PIP等安装程序脚本将为您处理相关性的升级。

为了解决软件包的更新问题,我build议使用PIP需求文件 。 您可以定义您需要的软件包和版本,并使用pip install来一次性安装它们。

我写了一个快速的脚本来解决这个问题。 以下脚本将显示任何给定包的父(依赖)包。 这样,您可以确保升级或安装任何特定软件包是安全的。 它可以使用如下: 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))) 

(解决方法,不是真正的答案)

有同样的问题,与lxml不安装,我想知道谁需要lxml。 不是谁需要 。 最终绕过这个问题。

  1. 注意我的网站包裹被放置在哪里。

  2. 去那里和recursiongrep的导入(最后grep的 – 反向匹配服务来删除lxml自己的文件考虑)。

是的,这不是一个如何使用点子来做的答案,但是我没有得到任何成功的build议,无论出于何种原因。

  site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/