Python 的包管理

2018-12-12 04:19:16 +08:00
 raawaa

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

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

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

4173 次点击
所在节点    Python
29 条回复
Trim21
2018-12-12 06:01:01 +08:00
Q:生成 Pipfile.lock 太慢?

A:不像 npm 等依赖管理工具(依赖通过纯文本定义),对于 Python 包,如果你要获取详细的依赖情况,需要下载安装包并执行 setup.py 文件,所以会耗费一定时间。通常来说,更换 PyPI 源已经可以大幅提升速度。如果你仍然不想等待生成 Pipfile.lock 的时间,那么可以在执行 pipenv install 命令时添加--skip-lock 选项来跳过 lock 步骤,最后使用 pipenv lock 命令来统一执行 lock 操作。
xiaket
2018-12-12 06:52:50 +08:00
据我所知, 那是因为 npm 根本没有处理依赖管理和版本冲突问题吧...
daxy223
2018-12-12 07:34:27 +08:00
anaconda 一劳永逸
orangeade
2018-12-12 07:51:49 +08:00
pip + virtualenv 不就够了?用 pipenv 的理由?
OldPanda
2018-12-12 07:55:42 +08:00
赞成楼上和楼上的楼上,平时自己开项目还是 virtualenv + pip 用的比较多,除非是刻意想要了解一下 pipenv 这个新工具
silkriver
2018-12-12 08:07:30 +08:00
pip 加标准库的 venv 也就够了
fivestrong
2018-12-12 08:07:34 +08:00
pipenv 改一下 pipfile 里面的下载地址,会快很多
zst
2018-12-12 08:07:57 +08:00
用 anaconda 吧 舒服
xiaket
2018-12-12 08:12:01 +08:00
@orangeade

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 里加东西不是?
clino
2018-12-12 08:28:01 +08:00
没用过 pipenv,大概看了下也觉得没需要用
直接用 virtualenv 觉得就挺好了
im67
2018-12-12 08:50:43 +08:00
推荐 pipenv,跟 npm 很像
chengxiao
2018-12-12 09:00:49 +08:00
python 因为系统中经常存在多个版本且可能会切换的原因 所以感觉 pipenv 其实不是最好的选择
常规的 pip+virtualenv 是最稳定的
xuanli
2018-12-12 09:19:20 +08:00
pip + venv 或者 virtualenv
vissssa
2018-12-12 09:24:56 +08:00
pyenv 每个文件夹一个环境
freakxx
2018-12-12 09:49:54 +08:00
下载慢换源:
[[source]]

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


[packages]


lock 慢,加上
--skip-lock
ClutchBear
2018-12-12 10:02:59 +08:00
包管理用 requirement.txt 就行了啊.
用那么复杂的工具干啥.
jmc891205
2018-12-12 10:24:14 +08:00
conda 也不错 pip+venv 也够用
xiaotiange
2018-12-12 10:34:58 +08:00
用 anaconda,发现真香,包管理加环境管理,一劳永逸
xpresslink
2018-12-12 10:54:37 +08:00
目前做 Python 开发部署,比较成熟普遍的工程实践是使用 virtualenv
在开发的时候用 Pycharm 创建一个项目和对应的虚拟环境,
每需要增加一个包就在项目根目录的的 requirements.txt 中增加一行包名,
这个特性是被 Pycharm 支持的,pycharm 就自动帮你把包装在虚拟环境了。

部署的时候也是先用 virtualenv 先创建一个虚拟环境然后在虚拟环境中执行
pip install -r requirements.txt 就自动把所有依赖包安装齐了。
saucerman
2018-12-12 10:56:51 +08:00
Anoconda 会改变你对 python 各种乱七八糟的包和版本的混乱看法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516715

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX