Python 的包管理感觉怎么这么不优雅。。。

2018-01-03 23:00:14 +08:00
 serge001

本人前端一枚,习惯了 node 的 npm 之后感觉配置和使用起来都很简单方便,最近学习了一点 python 后,感觉 python 的包管理怎么这么不优雅。首先,配置文件居然是用 txt 文件来写的,二进制文件我用编辑器是无法打开的,然后用 git 也不能很好的版本管理;其次,pip install 是把包全都装在了全局,打开用户目录,一大堆以点开头的文件夹,抓狂。。。

19570 次点击
所在节点    Python
120 条回复
wibile
2018-01-04 09:53:34 +08:00
npm 五十步笑百步啊。。。。。pip 确实不优雅,npm 简直了。。。。。
airborne007
2018-01-04 09:57:07 +08:00
npm 居然敢说 pip ?
janxin
2018-01-04 09:58:52 +08:00
npm 能嘲笑的大概只有 go 和 C++了吧?
j717273419
2018-01-04 10:00:38 +08:00
python10 年前的代码,今天还能用。
nodejs10 个月前的代码,今天怎么用?
serge001
2018-01-04 10:20:40 +08:00
@scriptB0y 感谢感谢,早上起来一看感觉自己无脑发的帖子好傻逼😭😭
g0thic
2018-01-04 10:21:49 +08:00
学的姿势不对啊

一般教程不都是教你先安装一个虚拟环境的么 这样可以避免包的混乱和版本冲突
XIVN1987
2018-01-04 10:27:44 +08:00
所以楼主可以在发个帖子控诉下辣椒编辑器 atom 把 txt 文件识别成二进制文件⊙∀⊙?
Tyanboot
2018-01-04 10:31:17 +08:00
优雅?知乎看多了?
whx20202
2018-01-04 10:31:31 +08:00
没有任何嘲讽的意思哈,但是网上评价好像 npm 比 pip 要挫一点把
前一阵子不是还有个 nodejs 开发者 删了自己的库,那个库是字符串处理的,
导致几十个 几百个知名的库都不能用的问题吗
jyf
2018-01-04 10:34:07 +08:00
楼上的嘲讽都没什么意思

我理解楼主说的 txt 应该是指相对于 npm 用 json 这种有格式的配置 为何 pip 要用 txt 这种没格式的

首先 pip 的 txt 其实也是有微格式的 只是你可能没用到 只是看到名字罗列而已
其次 基于行文本是个 unix 传统 可能 pip 的作者比较欣赏这种 又或者只是遵循了周围的惯例
最后 安装到全局这个确实不如 npm 方便 但是 npm 出来前 大家都是默认这么干 也没什么好说的 可以去推动他改 至于说用户目录下一堆点开头的目录 这又是一个 unix 传统 :D

PS 感觉现在社区总是嘲讽多 回答少 不如从前了
param
2018-01-04 10:34:57 +08:00
@zachguo 那么 npm 的 cbinding 怎么处理?
Cambrian07
2018-01-04 10:36:50 +08:00
我觉得 txt 没毛病啊
Wolther47
2018-01-04 10:42:36 +08:00
@jingniao #16 golang 的包管理真的差
yichinzhu
2018-01-04 10:47:49 +08:00
npm 的 package.json 本质不还是 txt,有什么区别,,,
bestkayle
2018-01-04 10:55:53 +08:00
npm 才恶心。。动不动一堆错误警告,想尝试一下都报打击的没欲望了。
param
2018-01-04 10:58:48 +08:00
其实大多数包,在 archlinux 下用 pacman 或者 AUR 装,都自动处理好了 C 库的依赖。
装 python-lxml 的时候,会自动安装依赖 libxslt,装 python-scipy 会自动安装 scipy。
param
2018-01-04 11:08:39 +08:00
关于包的列表,以行来分割有很大的方便性。sed、grep、xarg、cut 等等的工具都是以行为单位处理的。
我就是通过 pip freeze > pip_package_list 来备份包列表,同时把列表放在 dotfiles 里面的。
我最近尝试在我的 dotfiles 下加一个 Dockerfile,通过 docker 来让我的服务器保持跟我桌面一样的环境(装相同的软件,相同的 zsh、vim 配置)。
我在 Dockerfile 里的其中一个操作就是 pip install -r <(cut -d = -f 1 pip_package_list) --user,通过 cut 命令来把版本号截掉,从而让 pip 安装最新版本。
wizardoz
2018-01-04 11:10:15 +08:00
npm install 一次都能下班了,我说什么了吗?
vwxyzjn
2018-01-04 11:15:47 +08:00
@scriptB0y 不同意您的回答

> 我假设你说的是管理依赖?一般写到 requirements.txt 里面,手动写更容易控制版本和依赖。

实在不知道您是如何得出这个结论的。依赖是 nested 的。也就是有依赖的依赖的依赖。你不用软件来记录这些 nested dependencies,最后的结果就是 inderterministic build.

Pip 最大的问题是其缺乏重现能力… npm 的 package.json 和 npm install 虽然繁琐并且一个小小的项目就会用到几百兆的硬盘,但是其有极好的重现能力。也就是说,给你一个 package.json 和项目源码,你是可以重新跑这个项目的。

而 pip 的重现能力就令人质疑了。如果您随便去 github 找个 jupyter notebook,只要它用了一些小众的 library 像 websocket, aiohttp 之类的,很有可能那个 notebook 会跑出错误,因为 ipynb 并不记录其依赖的包。

在写过一段时间 npm 的代码后,我又重新写回了 python 代码,又出现一些奇奇怪怪的错误,然后我去 google 查这个错误,发现是某个包的版本错误了,然后我用 pip 来更新这个包,最后解决了这个 bug。但是我不应该要操心这种 bug。pip 应该帮我记录*所有*的依赖。

然而 pip 做依赖有各种各样的问题,有兴趣的可以看看这篇文章 https://medium.com/@alonisser/things-i-wish-pip-learned-from-npm-f712fa26f5bc?source=linkShare-c6ac3e2e940f-1515034677

其中提到很有意思的一个事情,也就是 python 不允许一个 library 存在两个版本。但假如说你有两个包,包 A 依赖包 C@1.1,包 B 依赖包 C@1.2。你用 pip 装完 A 和 B,你会发现包 C 是版本 1.1 *或者* 1.2 (看你安装的顺序)。但是实际这种情况经常发生,发生的时候你只能祈祷包 C 没做什么大的改动,所以代码还可以跑,但这毕竟还是显示了 python/pip 重现能力有很大问题。

有些人提到了 python 有 pipenv。这个项目确实不错,但是实际用起来*好像*还是有各种问题。我用过一次,但是装了一些依赖后又出现一些奇怪的错误,似乎和 C-extension python 包有关系,总之用得不像 npm 那样畅快。

看到大多数人都说 pip 比 npm 好,我觉得可以理解(因为你不用为每一个项目繁琐地装几百兆依赖),但是我认为这种看法是不深刻的。

我是很喜欢 python 的,但是每每想到这个问题就觉得很难受。觉得自己写的代码无法保证在别人电脑上也可以 deterministically 跑。也许某天某些包升级了,我的代码就失效了,这实在是让人担忧和痛心的事。

希望大家理性看待。
arvinwangzj
2018-01-04 11:37:36 +08:00
个人觉得 pip 还是很好用的,关于安装在全局的问题,不同项目可以使用 virtualenv,就可以独立安装,互不影响。virtualenv 操作又不繁琐

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

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

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

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

© 2021 V2EX