刚刚入门 python, 是从隔壁 nodejs 转过来的.
node 里用 npm 管理包和依赖十分方便, python 里貌似最近才出现类似的东西:pipenv
但是 pipenv 每次算个 lockfile 就要很久, 效率好低. 难道 python 的依赖管理就这么不堪吗. 求教
1
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 操作。 |
2
xiaket 2018-12-12 06:52:50 +08:00 1
据我所知, 那是因为 npm 根本没有处理依赖管理和版本冲突问题吧...
|
3
daxy223 2018-12-12 07:34:27 +08:00 via Android
anaconda 一劳永逸
|
4
orangeade 2018-12-12 07:51:49 +08:00 via Android 1
pip + virtualenv 不就够了?用 pipenv 的理由?
|
5
OldPanda 2018-12-12 07:55:42 +08:00
赞成楼上和楼上的楼上,平时自己开项目还是 virtualenv + pip 用的比较多,除非是刻意想要了解一下 pipenv 这个新工具
|
6
silkriver 2018-12-12 08:07:30 +08:00
pip 加标准库的 venv 也就够了
|
7
fivestrong 2018-12-12 08:07:34 +08:00 via Android 1
pipenv 改一下 pipfile 里面的下载地址,会快很多
|
8
zst 2018-12-12 08:07:57 +08:00 via Android
用 anaconda 吧 舒服
|
9
xiaket 2018-12-12 08:12:01 +08:00 5
@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 里加东西不是? |
10
clino 2018-12-12 08:28:01 +08:00
没用过 pipenv,大概看了下也觉得没需要用
直接用 virtualenv 觉得就挺好了 |
11
im67 2018-12-12 08:50:43 +08:00 1
推荐 pipenv,跟 npm 很像
|
12
chengxiao 2018-12-12 09:00:49 +08:00
python 因为系统中经常存在多个版本且可能会切换的原因 所以感觉 pipenv 其实不是最好的选择
常规的 pip+virtualenv 是最稳定的 |
13
xuanli 2018-12-12 09:19:20 +08:00
pip + venv 或者 virtualenv
|
14
vissssa 2018-12-12 09:24:56 +08:00
pyenv 每个文件夹一个环境
|
15
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 |
16
ClutchBear 2018-12-12 10:02:59 +08:00
包管理用 requirement.txt 就行了啊.
用那么复杂的工具干啥. |
17
jmc891205 2018-12-12 10:24:14 +08:00
conda 也不错 pip+venv 也够用
|
18
xiaotiange 2018-12-12 10:34:58 +08:00 via Android
用 anaconda,发现真香,包管理加环境管理,一劳永逸
|
19
xpresslink 2018-12-12 10:54:37 +08:00
目前做 Python 开发部署,比较成熟普遍的工程实践是使用 virtualenv
在开发的时候用 Pycharm 创建一个项目和对应的虚拟环境, 每需要增加一个包就在项目根目录的的 requirements.txt 中增加一行包名, 这个特性是被 Pycharm 支持的,pycharm 就自动帮你把包装在虚拟环境了。 部署的时候也是先用 virtualenv 先创建一个虚拟环境然后在虚拟环境中执行 pip install -r requirements.txt 就自动把所有依赖包安装齐了。 |
20
saucerman 2018-12-12 10:56:51 +08:00 via Android
Anoconda 会改变你对 python 各种乱七八糟的包和版本的混乱看法
|
21
zqguo 2018-12-12 11:02:06 +08:00
pipenv 真香
|
22
www5070504 2018-12-12 11:24:15 +08:00 1
python 的包管理就跟 shi 一样 居然还有重名包这种操作 当初刚开始弄 docker 的时候简直没被坑死
|
23
miniyao 2018-12-12 11:34:09 +08:00
包管理里面的自依赖版本冲突,虽然日常中出现的比较少,也没有发现好的解决方法。
|
24
frostming 2018-12-12 14:47:28 +08:00
|
25
raawaa OP @xiaket "npm 没有处理依赖管理和版本冲突问题"这点不太明白。
http://npm.github.io/how-npm-works-docs/gitbook/images/npm3deps4.png 我的理解仅限于上面这张老图…… |
26
xiaket 2018-12-13 07:24:22 +08:00
每个包有个自己的子命名空间什么, 就我的理解, 真的不叫处理吧?
|
27
frostming 2018-12-13 11:35:50 +08:00
@raawaa 解决冲突的结果就是整个环境中 A 包只存在一个版本,而这个版本是考虑所有依赖后找到的满足所有限制的版本。不像 npm,可能会有多个版本共存。
pip 没有解决这个问题,最后 A 包的版本可能并不满足所有限制 |
28
frostming 2018-12-13 11:37:36 +08:00 1
|