支持 PEP 582 的 Python 包管理器,和虚拟环境说再见

2020-02-21 21:53:12 +08:00
 frostming

我们需要又一个新的包管理器吗? I don't think so! 包管理器已经够乱了

在 virtualenv 20.0.0 经历了大升级以后,pyenv virtualenv virtualenvwrapper poetry 这一套已经足够好用。但,What's more? 有没可能完全抛弃 virtualenv? PEP 582 就是答案。

Yes!! 春节宅家防疫撸代码,自造包管理器 pdm 已经发布 0.2.4 版本


4555 次点击
所在节点    Python
17 条回复
nightwitch
2020-02-21 22:18:58 +08:00
包管理器和虚拟环境不应该是独立不相关的两个组件吗
shidenggui
2020-02-21 22:23:07 +08:00
支持,一直希望能有个独立于虚拟环境管理的包管理器。
frostming
2020-02-21 22:50:52 +08:00
@nightwitch 是的没错
1. 如果你用 Pipenv 和 Poetry,那就是一个工具,包管理和虚拟环境都有
2. 如果你用 pip,那就是包管理+虚拟环境得分别两个工具
3. 但如果你用 pdm,压根就不需要虚拟环境
rogwan
2020-02-21 22:53:51 +08:00
什么时候 pycharm 换掉 virtualenv,再跟着换
rogwan
2020-02-21 22:55:37 +08:00
出了部署的时候会动手布置 venv,日常都是用 IDE 如 pycharm 里默认的 virtualenv 很方便
secsilm
2020-02-21 22:58:35 +08:00
conda 这么没存在感吗
frostming
2020-02-21 23:00:44 +08:00
@rogwan virtualenv 最新版已经和 venv 差别不大了
frostming
2020-02-21 23:01:58 +08:00
@secsilm conda 在管理 C extension 很多的库这方面地位无可动摇,我也不打算动摇
ClericPy
2020-02-22 01:03:15 +08:00
随手试了下, 安装挺快的, 不用像以前一样折腾 shiv 了

不过解释器部分感觉怪怪的, init 的时候没有解释器参数, add 的时候, __pypackages__ 里文件夹是我默认 3.7 没错, .pdm.toml 文件里的解释器路径也是 3.7 的没错, 但是 add 的库给我下载的全是 py2 的 whl...... 当场凌乱了

certifi-2019.11.28-py2.py3-none-any.whl
chardet-3.0.4-py2.py3-none-any.whl
futures-3.1.1-py2-none-any.whl
idna-2.6-py2.py3-none-any.whl
requests-2.18.4-py2.py3-none-any.whl
torequests-4.9.2-py2-none-any.whl
urllib3-1.22-py2.py3-none-any.whl
ClericPy
2020-02-22 01:08:56 +08:00
复现方式
1. pdm init
2. pdm add futures
3. 执行脚本的 py 文件只要一行 from concurrent.futures._base import FIRST_COMPLETED
主要就是 concurrent.futures._base 覆盖了默认 python3.7 的, 但是里面 381 行语法是 python2 的

我这全局 python 是 3.7 的, 和 python2 共存, windows10, pylauncher 的 py.exe 默认也是 3.7
Cbdy
2020-02-22 09:51:02 +08:00
其实,Docker 主要就是为 Python 设计的
frostming
2020-02-22 11:30:07 +08:00
@ClericPy 感谢,已重现 https://github.com/frostming/pdm/issues/48

确实 Python 包太多样了,什么问题都有可能出现,自己用是测不全的
ClericPy
2020-02-22 12:19:46 +08:00
@frostming #12 期待 new release

提几个小需求, 不是很重要那种:

1. 目前升级单个 package 的语法是什么没找到, 之前 pipenv 升级单个包的那个命令有 bug, 然而 fix 的版本没 release 到 pypi 上, 坑惨我了, 楼主作为贡献者, 知道为啥 pypi 最新版本还是 2018 那个么

2. 有清理掉当前目录 pdm 全部相关文件夹的指令么, 有时候要重建 init, 发现旧的 __pypackages__ 似乎留下了, 有时候又纯粹想清理清理

3. 有计划支持 PEP 441 那种把整个项目打包成 pyz 么, 就是 linkedin/shiv 做的那样类似的, 毕竟依赖什么的都收集好了, 单文件发布的时候更省力气, 不过好像又和 pdm 初衷不太接近
frostming
2020-02-22 14:29:59 +08:00
@ClericPy
1. pdm update <package> 而且可以指定是只升级此 package,依赖不动,还是升级此 package 及其递归依赖,其他无关依赖不动,不给<package>就升级所有依赖。
2. 我理解这个动作比较 trivial,毕竟__packages__目录直接 rm -r 就好
3. 这个可能超出 scope 了,和 vendorize 一样,不是把包放一起就行了,涉及到 Import 的修改
AndyAO
2021-09-18 18:41:58 +08:00
作者🐮🍺,梦开始的地方,Star 支持下。
frostming
2021-09-22 09:34:09 +08:00
@ClericPy 一年过去了,回头看你提的第 3 个需求,现在已经支持了,不过是通过插件(顺便 pdm 写插件超好写): https://github.com/frostming/pdm-packer
ClericPy
2021-09-22 21:32:48 +08:00
@frostming 居然还记得呢

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

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

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

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

© 2021 V2EX