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

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

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

20145 次点击
所在节点    Python
120 条回复
scriptB0y
2018-01-04 16:51:11 +08:00
@vwxyzjn 我知道你说的这种情况,但是真的我自己没遇到过…… 一般的包都会努力去兼容最新的依赖。

像你说的这个例子,我觉得根源不在包管理器上,而在设计的软件向后兼容上。这个问题不像是包管理器能解决的吧。就像 a.py 用的 python2 ; b.py 用的 python3,想要在一个程序 import a, b 怎么可能呢?
ipwx
2018-01-04 16:52:25 +08:00
@vwxyzjn Python 社区有很多“约定俗成”,你得习惯它们,并且享受它们。譬如 x.y.z,社区标准是保证 x. 不变程序就能跑,y 不变不会加入新功能。大家写程序也会考虑这个原则,如果不能,那么这个包大概是无法成为知名的包。

当然,特殊规定是,0.y.z 不考虑兼容性。直到 1.0.0 以后才有这个规定。所以你举得例子 pandas,不巧它才 0.20 。NumPy 已经 1.0 了,TensorFlow 也是,所以可以期待其兼容性。
vwxyzjn
2018-01-04 16:53:57 +08:00
@scriptB0y 另外我感觉我们说的似乎不是一个东西。我感觉您说的那个 requirement_base.txt 似乎更像是对项目的高阶描述:说的是我们主要的依赖是这些包,而我说的是 python/pip 缺乏重现能力。

> 基本不会冲突(我没遇到过),因为大家一般都是规定最低版本。如果真有两个包最高版本冲突,那说明其中有一个包太久不更新或者本身就存在问题,具体解决吧。

您的意思是似乎是说,出现了依赖冲突我们再想办法解决,而我是说,如果 pip 和 npm 一样,我们连这样的冲突都不会碰到,所以在这个角度上,pip 的设计是有缺陷和落后的。

另外您很少遇到不代表别人很少遇到,我 debug 这种依赖相关的 bug 应该不算少,总是要 pip uninstall,install,然后通过一番努力终于代码能跑。然而我厌倦了这种 debug,既然有 npm 这种一键解决你依赖问题的安装方式,为什么每次要自己找麻烦去手动解决依赖 bug 呢?
vwxyzjn
2018-01-04 17:02:18 +08:00
@jhdxr 感同身受… 经常是 pip install 后出现一些奇怪的红字,然而无休无止无意义的依赖 debug 开始了
renothing
2018-01-04 17:02:22 +08:00
无论是 pip 还是 pipenv 都没解决依赖冲突,一个项目两个包依赖同一个包不同版本的情况。
vwxyzjn
2018-01-04 17:18:07 +08:00
@scriptB0y,@ipwx 您们说的约定俗成,向下兼容都是好的实践,但我说的重现能力…… 另外 js 未必就不能做你们说的最好实践。

所谓重现能力是我今天写的代码明天还能跑,而不是因为一些莫名其妙的原因不能跑了。和您们讲个自己的例子吧,我第一次写的小 /中型项目 https://github.com/streettraffic/streettraffic 用到了 websockets==3.3 这个依赖。我 setup.py 是乱写的,连版本号都没写,所以我写完几个月重装时发现跑不了了,后来 debug 之后发现是 websockets 高等版本破坏了原有的 api。

哪怕我在 install_requires 里面写了 websockets==3.3,只要别人在安装我的项目之后再安装一个项目有用到 websockets 的更高版本,我的代码就会报错了。

是的,我可以维护这个项目去修 bug,但是每个人的精力是有限的,并且你主要工作的项目也会变,所以我并不愿意改这个 api。我并不认为这样是错误的,并且我认为我写的代码如果能跑,便不应该因为这种依赖问题到后期某一天报错。
wibile
2018-01-04 17:53:29 +08:00
@vwxyzjn 大哥,这问题明显需要升级来解决啊。包 1 和包 2 都是活跃的项目,基本不会有类似问题,人家肯定会做依赖升级啊。如果不是活跃的项目,手动 fork 一下,自己适配。所以啊,别用些没人用的包。。。给自己找麻烦。。。
mooncakejs
2018-01-04 18:00:58 +08:00
又吵起来了哈哈,再怎么否认,python 的包管理对于项目开发就是一坨屎(作为系统工具还是可以的),各种 env 就是尝试把这坨屎的臭味盖起来。
kslr
2018-01-04 18:05:06 +08:00
感觉 PIP 真的是比 NPM 麻烦多了,比如环境的多版本,搞一堆方案,哪有带着依赖走爽。我现在也只用可以打包依赖的语言。
ipwx
2018-01-04 18:13:26 +08:00
@vwxyzjn All right,你说的问题确实存在,但是 virtual env / anaconda env / docker 不是都能解决你的问题嘛?我觉得总有一款合适,所以不是什么大问题。

@mooncakejs 您这话说的。为什么不把 pip + virtual env / anaconda env 当做一个整体看,那样不就清静了么?还有 @kslr 您说的这个需求,Anaconda 就支持。如果你更勤快点,Docker 也不错。总而言之您二位为什么就偏要把 pip 单独拿出来批判一番呢?
mooncakejs
2018-01-04 18:21:38 +08:00
@ipwx anyway,任何缺陷都是可以修正的,比如这几天的 CPU bug,只不过弥补缺陷的代价不一样。 docker 对于这些依赖问题确实可以解决,但也只是比较好看的“布”罢了。
kslr
2018-01-04 18:22:41 +08:00
@ipwx #90 如果你能接受,没有人阻止你。再者我只表达意见,没有说服其他人的兴趣。
jhdxr
2018-01-04 18:29:53 +08:00
@ipwx 那些不是包管理工具,那些已经是用来给 pip 这么一个巨坑在那填坑的工具了
vwxyzjn
2018-01-04 18:31:57 +08:00
@ipwx 因为我最经常用 python 啊,但是想到以后写的代码会有这样重现问题就很头疼…
blless
2018-01-04 19:11:30 +08:00
说白了就是 npm 支持多版本管理呗 。很难想象一个项目用那么包还要凑一起…要我们早就拆成不同服务了。我还是倾向单一版本管理… npm 用得我真的难受
swulling
2018-01-04 19:16:27 +08:00
现在 Pip 的问题是依赖,很多人直接 pip freeze > requirements.txt 简直想屎,没有依赖链很难受
crysislinux
2018-01-04 19:17:21 +08:00
说 npm 难受的,你们像用 pip 一样用 npm,就没问题了。。
leemove
2018-01-04 19:28:37 +08:00
v2 里面敢黑 python?宝宝你是不想活了.
????????????赶紧叫 js,php 来主动接锅.
leemove
2018-01-04 19:29:28 +08:00
@crysislinux Npm 难用不在 npm 本身,在于 npm 不是 python 的生态.所以都不许好用!
winglight2016
2018-01-04 19:30:37 +08:00
之前不是有个帖子在说:python 性能差是公认的吗?不要用 python 做复杂业务就可以了吧,我猜。。。

另外,conda 新建 environment 也很简单啊,多版本管理没什么问题的

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

https://tanronggui.xyz/t/419850

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

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

© 2021 V2EX