轮子推荐:一款不需要虚拟环境的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 患者解决各类疑难杂症。




本文作者: 杜赛
发布时间: 2021年04月13日 - 12:45
最后更新: 2021年04月13日 - 16:41
转载请保留原文链接及作者