Python中如何进行包管理?

刚刚入门 python, 是从隔壁 nodejs 转过来的.

node 里用 npm 管理包和依赖十分方便, python 里貌似最近才出现类似的东西:pipenv

但是 pipenv 每次算个 lockfile 就要很久, 效率好低. 难道 python 的依赖管理就这么不堪吗. 求教


Python中如何进行包管理?
30 回复

Q:生成 Pipfile.lock 太慢?

A:不像 npm 等依赖管理工具(依赖通过纯文本定义),对于 Python 包,如果你要获取详细的依赖情况,需要下载安装包并执行 setup.py 文件,所以会耗费一定时间。通常来说,更换 PyPI 源已经可以大幅提升速度。如果你仍然不想等待生成 Pipfile.lock 的时间,那么可以在执行 pipenv install 命令时添加–skip-lock 选项来跳过 lock 步骤,最后使用 pipenv lock 命令来统一执行 lock 操作。


Python的包管理主要靠pip和虚拟环境。pip是官方推荐的包安装工具,用pip install package_name就能装包。配合requirements.txt文件(用pip freeze > requirements.txt生成,pip install -r requirements.txt安装)能很好地管理项目依赖。

虚拟环境方面,官方有venv模块。创建用python -m venv myenv,激活后(Windows是myenv\Scripts\activate,Linux/Mac是source myenv/bin/activate)再装包,依赖就隔离了。

现在很多人也用conda,特别是做数据科学,它能管Python包和非Python的库。

总结:用pipvenv是标准做法。

据我所知, 那是因为 npm 根本没有处理依赖管理和版本冲突问题吧…

anaconda 一劳永逸

pip + virtualenv 不就够了?用 pipenv 的理由?

赞成楼上和楼上的楼上,平时自己开项目还是 virtualenv + pip 用的比较多,除非是刻意想要了解一下 pipenv 这个新工具

pip 加标准库的 venv 也就够了

pipenv 改一下 pipfile 里面的下载地址,会快很多

用 anaconda 吧 舒服



pip 解决冲突的办法挺凑合的, 有些 corner case 没解决好.

例如你需要安装某包 A 和 B, A 依赖某 C > 1.5, B 依赖某 C <= 2.0, 此时, 某 C 的最新版是 2.3. 我们期待 pip 安装的结果是装一个满足 1.5 < C <= 2.0 的版本, 但是 pip 会按 requirements 文件的顺序挨个解决冲突, 因此它先看 A 的依赖, 发现要大于 1.5, 于是直接装了一个满足大于 1.5 的版本 2.3, 等回头要装 B 的时候就耍赖报个版本冲突的警告不管了. 我们使用时的解决办法是锁 C 的版本为 2.0,并写到 A 和 B 的前面, 这样安装 A 和 B 时发现依赖都已经被满足了, 不会装新包. Github 上相关讨论链接: https://github.com/pypa/pip/issues/988

pipenv 在这一点上是比 pip 更好的. 它会分析一个 requirements 文件里的所有依赖, 然后正确解决上面所述的冲突. 这一点上, 是比 pip 优秀的.

当然, 它还有一些较小的方便之处, 例如, 所有的 venv 都会放在一个统一的地方, 不会放到当前目录下, 这样你也不需要在.gitignore 里加东西不是?

没用过 pipenv,大概看了下也觉得没需要用
直接用 virtualenv 觉得就挺好了

推荐 pipenv,跟 npm 很像

python 因为系统中经常存在多个版本且可能会切换的原因 所以感觉 pipenv 其实不是最好的选择
常规的 pip+virtualenv 是最稳定的

pip + venv 或者 virtualenv

pyenv 每个文件夹一个环境

下载慢换源:
[[source]]

url = "https://pypi.doubanio.com/simple"
verify_ssl = true
name = “douban”


[packages]


lock 慢,加上
–skip-lock

包管理用 requirement.txt 就行了啊.
用那么复杂的工具干啥.

conda 也不错 pip+venv 也够用

用 anaconda,发现真香,包管理加环境管理,一劳永逸

目前做 Python 开发部署,比较成熟普遍的工程实践是使用 virtualenv
在开发的时候用 Pycharm 创建一个项目和对应的虚拟环境,
每需要增加一个包就在项目根目录的的 requirements.txt 中增加一行包名,
这个特性是被 Pycharm 支持的,pycharm 就自动帮你把包装在虚拟环境了。

部署的时候也是先用 virtualenv 先创建一个虚拟环境然后在虚拟环境中执行
pip install -r requirements.txt 就自动把所有依赖包安装齐了。

Anoconda 会改变你对 python 各种乱七八糟的包和版本的混乱看法

pipenv 真香

python 的包管理就跟 shi 一样 居然还有重名包这种操作 当初刚开始弄 docker 的时候简直没被坑死

包管理里面的自依赖版本冲突,虽然日常中出现的比较少,也没有发现好的解决方法。

之所以 virtualenv+pip 够用是没碰到坑

描述的问题是真实存在且 pip 没有解决的,pipenv 不仅是 pip+virtualenv,它还包括 resolver.

"npm 没有处理依赖管理和版本冲突问题"这点不太明白。

http://npm.github.io/how-npm-works-docs/gitbook/images/npm3deps4.png

我的理解仅限于上面这张老图……

每个包有个自己的子命名空间什么, 就我的理解, 真的不叫处理吧?

解决冲突的结果就是整个环境中 A 包只存在一个版本,而这个版本是考虑所有依赖后找到的满足所有限制的版本。不像 npm,可能会有多个版本共存。

pip 没有解决这个问题,最后 A 包的版本可能并不满足所有限制

解决冲突就好像在解方程组:
A>=2.0, < 3.0
A~=2.0
A>=2.5

解得 A==2.8.5,所以这个过程叫 resolve

明白了

回到顶部