热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python使用pip安装依赖库_识别用pip安装的python包的依赖关系

当我执行pip冻结时,我看到大量没有显式安装的python包,例如。$pipfreezeCheetah2.4.3GnuPGInterface0.3.2L

当我执行pip冻结时,我看到大量没有显式安装的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反向列出,以便找到可以运行的已安装的werkzeug:

$ pipdeptree -r -p Werkzeug

Werkzeug==0.11.15

- Flask==0.12 [requires: Werkzeug>=0.7]

我相信要完全回答@mark的问题,您需要运行:pipdeptree -r以相反的方式显示依赖树,即子依赖项与需要它们的包列表一起列出。

类似项目:github.com/rbaffy/pip-chill

如何查看所有pypi包的反向树,而不仅仅是本地安装的包?

pipdeptree很棒。不幸的是,它似乎没有考虑到Conda安装的包的依赖性:例如,在Conda环境中,matplotlib和numpy是使用PIP安装的,但scipy是使用Conda安装的,scipy在PipeDeptree中显示为没有依赖项,也没有依赖项(同样,pip show scipy)显示为没有要求。结果)。

@丹尼斯,我没试过,但这可能对康达吉特胡布网站/rvalieris/conda-tree有用。

pip show命令将显示指定包所需的包(请注意,必须已安装指定包):

$ pip show specloud

Package: specloud

Version: 0.4.4

Requires:

nose

figleaf

pinocchio

在PIP版本1.4RC5中引入了pip show。

pip show在版本1.4rc5中引入,并出现在(当前编写时)1.4.1中。

这并不能准确回答我的问题,因为它显示特定包的子项(依赖项),而不是父项。但是使用这个命令,将一些东西放在一起检查每个包的依赖性已经足够容易了。例如,我可以确定哪个安装的包需要pyyaml。

根据我之前的评论,这个shell命令转储了我安装的每个软件包的所有依赖项:$pip freeze grep-v"-e"sed s/=.*/awk'system("pip show"$1)'

我先前评论中的脚本更新版本是pip freeze | grep -v"\-e" | sed s/\=\=.*// | awk 'system("pip show" $1)' | grep -E '^(Name:|Requires:)' | sed s/Name:/\\

Name:/,但现在看来pippedpree是更好的解决方案。

正如我最近在一个hn线程上所说,我将推荐以下内容:

有一个带有您主要依赖项的注释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来重建完整的requirements.txt。

注意在这个过程中Git URL被蛋名称替换。

依赖项的依赖项仍然按字母顺序排序,因此您不直接知道哪个包需要哪个包,但此时您并不真正需要它。

使用pip install --no-install列出具体要求。

如果没有,请使用virtualenv。

我只是不明白为什么这个pip freeze -r requirements.txt没有被广泛使用。对于维护依赖项和子依赖项非常有用。

小注:pip install不再支持--no-install。

您还可以使用一个单行命令,将需求中的包传输到pip show。

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

一般来说,您不能这样做,因为requirements.txt的格式比==更复杂。

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

其次,python包确实包含有关依赖包以及所需版本的信息。您可以使用这里描述的方法看到特定pkg的依赖性。当您升级包时,像pip这样的安装程序脚本将为您处理依赖项的升级。

为了解决包的更新问题,我建议使用PIP需求文件。您可以定义所需的软件包和版本,并使用pip install立即安装它们。

我写了一个快速脚本来解决这个问题。以下脚本将显示任何给定包的父(依赖)包。通过这种方式,您可以确保升级或安装任何特定包都是安全的。其用途如下:dependants.py PACKAGENAME。

#!/usr/bin/env 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._internal.utils.misc.get_installed_distributions():

for requirement_package in package.requires():

requirement_name = requirement_package.project_name

if requirement_name == target_name:

yield package.project_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)))

这不再有效,因为get_installed_distributions()方法不再可用。github.com/pypa/pip/issues/5243(Github.com/pypa/pip/issues/5243)

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

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

注意我的网站包放在哪里。

到那里,递归grep进行导入(最后一个grep的--invert match用于从考虑中删除lxml自己的文件)。

是的,对于如何使用PIP来完成这项工作,我没有给出答案,但是我没有从这里的建议中得到任何成功,不管是什么原因。

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



推荐阅读
author-avatar
羚之舞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有