轮子推荐:一款不需要虚拟环境的Py包管理器
3685 views, 2021/04/13 updated Go to Comments
作为 Python 开发者,当前大部分的 Python 包管理器也同时管理虚拟环境,这主要是为了隔离项目的开发环境。
虚拟环境已经成为 Python 开发中必不可少的部分,但同时它也创造了进入障碍。
以下是它的部分问题:
- 对于新手来说,虚拟环境的工作方式令人困惑
- 不同的平台需要不同的命令集来激活虚拟环境
- 你需要在每个终端中都激活虚拟环境
- 多个虚拟环境嵌套的使用体验不佳
针对这些问题,本文介绍的 Python 包管理器: PDM - Python Development Master ,提供了一个将 Python 解释器和项目开发环境解耦的新途径。
以下是 PDM 的特点:
- 不依赖虚拟环境。
- 简单且快速的依赖解析器
- 完备的插件系统
PDM 使用起来非常轻松,接下来让我们尝试一下。
PDM 自身的安装需要 Python >= 3.7,但它并不限制项目使用的 Python 版本。
PDM的包管理
官方推荐用 pipx
安装 pdm
:
> pipx install pdm
接下来让我们来创建一个 Django 项目的隔离环境。
首先创建并进入项目路径:
> mkdir pdm-django > cd pdm-django
在此路径中初始化 PDM :
> pdm init
初始化时会询问此项目使用的 Python 版本,笔者选了 Python 3.6.8 。
完成后就可以正式开始使用 PDM 了,比如:
> pdm run python -V Python 3.6.8
用 pdm run
执行此环境下的脚本或可执行程序。
接下来安装 django:
> pdm add django
等待一会儿后,django 就安装完成了。
让我们试试把 django 的开发服务器给运行起来:
# 创建django项目 > pdm run django-admin startproject blog # 进入manage.py所在路径 > cd blog # 运行django服务器 > pdm run python manage.py runserver
Django 项目就顺利运行起来了。用浏览器访问 http://127.0.0.1:8000/
,看到了熟悉的小火箭页面。
这整个过程是完全未创建虚拟环境的。
查看当前 PDM
管理的包:
> pdm list Package Version ----------------- ------- asgiref 3.3.4 django 3.2 pytz 2021.1 sqlparse 0.4.1 typing-extensions 3.7.4.3
看不到任何全局中的包,非常的干净。
多项目环境
上面的例子演示了一下 PDM
管理的环境和全局环境是隔离的。接下来测试一下多个项目之间的环境是否也是隔离的。
在磁盘根路径下创建一个 Flask 的新项目:
# 创建并进入flask项目路径 > mkdir pdm-flask > cd pdm-flask # 初始化pdm > pdm init # 安装flask包 > pdm add requests flask
项目就创建好了。
查看 Python 解释器版本:
> pdm run python -V Python 3.9.1
初始化时笔者选择了 Python 3.9.1,和前面的 Django 项目做区分。
查看已安装的包:
> pdm list Package Version ------------ --------- certifi 2020.12.5 chardet 4.0.0 click 7.1.2 flask 1.1.2 idna 2.10 itsdangerous 1.1.0 jinja2 2.11.3 markupsafe 1.1.1 requests 2.25.1 urllib3 1.26.4 werkzeug 1.0.1
没有 Django 相关的东西,很好。
运行下 Django 的命令试试:
> pdm run django-admin startproject blog [PdmUsageError]: Command 'django-admin' is not found on your PATH.
Django 指令未能运行,说明环境确实是隔离了。
再试试运行 Flask 服务。
在 __pypackages__
同级的目录下创建 app.py
脚本:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
启动 Flask 服务:
> pdm run python app.py
Flask 服务就顺利运行起来了,完美!
另外,你还可以在 Bash 中执行eval $(pdm --pep582)
设置环境变量,现在你可以用你最熟悉的 Python 解释器 运行脚本了:
$ python /.../pdm-flask/app.py * Serving Flask app "app" (lazy loading) ... * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
以上就是一个现代化的 Python 包管理器的入门了,感觉如何?
以上操作不仅限于 Bash,这里只是拿 Bash 举例。
实际上
PDM
的功能远不止这些,有兴趣的读者就自行前往文档了解。
如何做选择
说这么多,让我们回到那个核心问题:是否应该在项目中使用 PDM?
- 如果你觉得
pipenv
或者poetry
用着感觉良好,也没什么不顺手的地方,那么继续使用它们吧。 - 如果你发现这些工具用起来不大顺手或者理解起来有困难,那么
PDM
可能是好的选择。
PDM项目 非常年轻且活跃。如果你也是积极的开源项目参与者,那么非常适合参与到此类项目中,甚至成为核心贡献者。
等到项目代码量膨胀且逐渐完善后,参与进来就需要更高的门槛了。
年轻项目的劣势就是版本进化速度非常快,并且容易产生 Bug。另一个潜在问题就是本项目属于先锋实验,其依据的 PEP 582 至今还是草案。
如何选择就根据读者的项目情况来确定了。就笔者的建议而言,你可以先在试验性项目中使用 PDM,若体验舒适,再逐步迁移到正式的项目中来。
PDM创建者
PDM创建者 Frost Ming,Python 开源爱好者,坐标深圳。Pycon
讲师,pipenv
核心贡献者。活跃于各大社交平台,帮助众多 Python 患者解决各类疑难杂症。