新项目

首先,使用 pdm init 创建一个新项目:

  1. mkdir my-project && cd my-project
  2. pdm init

您需要回答一些问题,帮助 PDM 为您创建 pyproject.toml 文件。 关于 pdm init 的更多用法,请阅读 从模板创建项目。

选择 Python 解释器

起初,您需要从安装在您机器上的 Python 版本列表中选择一个 Python 解释器。解释器路径将存储在 .pdm-python 中,并被后续命令使用。您也可以稍后使用 pdm use 更改它。

或者,您可以通过 PDM_PYTHON 环境变量指定 Python 解释器路径。当它被设置时,.pdm-python 中保存的路径将被忽略。

使用 PDM 安装 Python 解释器

+++ 2.13.0

PDM 支持使用 pdm python install 命令从 @indygreg’s python-build-standalone 安装额外的 Python 解释器。例如,要安装 CPython 3.9.8:

  1. pdm python install 3.9.8

您可以使用 pdm python install --list 查看所有可用的 Python 版本。

这将把 Python 解释器安装到 python.install_root 配置指定的位置。

列出当前安装的 Python 解释器:

  1. pdm python list

移除已安装的 Python 解释器:

  1. pdm python remove 3.9.8

!!! TIP “与 Rye 共享安装”

  1. PDM 使用与 [Rye](https://rye-up.com) 相同的源安装 Python 解释器。如果您同时使用 Rye,您可以将 `python.install_root` 指向与 Rye 相同的目录以共享 Python 解释器:
  2. ```bash
  3. pdm config python.install_root ~/.rye/py
  4. ```
  5. 之后您可以使用 `rye toolchain` 或 `pdm python` 管理安装。

虚拟环境与否

在您选择 Python 解释器之后,PDM 会询问您是否要为项目创建虚拟环境。 如果您选择 是,PDM 将在项目根目录中创建一个虚拟环境,并将其作为项目的 Python 解释器。

如果选定的 Python 解释器位于虚拟环境中,PDM 将使用它作为项目环境,并将依赖项安装到其中。 否则,将在项目根目录创建 __pypackages__ 并将依赖项安装到其中。

关于这两种方法之间的区别,请参考文档中的相关部分:

库或应用程序

库和应用程序在很多方面都有所不同。简而言之,库是一个旨在被其他项目安装和使用的包。大多数情况下,它还需要上传到 PyPI。另一方面,应用程序是面向最终用户的,可能需要部署到某些生产环境中。

在 PDM 中,如果您选择创建库,PDM 将在 pyproject.toml 文件中添加 name、version 字段,以及用于构建后端的 [build-system] 表,这仅在您的项目需要构建和分发时才有用。因此,如果您想将项目从应用程序更改为库,需要手动将这些字段添加到 pyproject.toml 中。另外,库项目在运行 pdm install 或 pdm sync 时将被安装到环境中,除非指定 --no-self。

设置 requires-python 值

您需要为项目设置一个适当的 requires-python 值。这是一个重要的属性,会影响依赖项的解析。基本上,每个包的 requires-python 必须 覆盖 项目的 requires-python 范围。例如,考虑以下设置:

  • 项目:requires-python = ">=3.9"
  • 包 foo:requires-python = ">=3.7,<3.11"

解析依赖项将导致 ResolutionImpossible:

  1. Unable to find a resolution because the following dependencies don't work
  2. on all Python versions defined by the project's `requires-python`

因为依赖项的 requires-python 是 >=3.7,<3.11,它 没有 覆盖项目的 requires-python 范围 >=3.9。换句话说,项目承诺在 Python 3.9、3.10、3.11(等等)上工作,但依赖项不支持 Python 3.11(或更高)。由于 PDM 创建的跨平台锁定文件应该在 requires-python 范围内的所有 Python 版本上工作,因此无法找到有效的解析。 要解决这个问题,您需要向 requires-python 添加最大版本,如 >=3.9,<3.11。

requires-python 的值是 PEP 440 定义的版本说明符。以下是一些示例:

requires-python 含义
>=3.7 Python 3.7 及以上
>=3.7,<3.11 Python 3.7、3.8、3.9 和 3.10
>=3.6,!=3.8.*,!=3.9.* 除了 3.8 和 3.9,Python 3.6 及以上

使用旧版 Python 工作

尽管 PDM 运行在 Python 3.8 及以上版本,您仍然可以为 工作项目 使用较低版本的 Python。但请记住,如果您的项目是一个库,需要构建、发布或安装,请确保使用的 PEP 517 构建后端支持您需要的最低 Python 版本。例如,默认后端 pdm-backend 只在 Python 3.7+ 上工作,所以如果您在 Python 3.6 的项目上运行 pdm build,会出现错误。大多数现代构建后端已经放弃了对 Python 3.6 及更低版本的支持,因此强烈建议将 Python 版本升级到 3.7+。以下是一些常用构建后端支持的 Python 范围,我们只列出那些支持 PEP 621 的,否则 PDM 无法工作。

后端 支持的 Python 支持 PEP 621
pdm-backend >=3.7 是
setuptools>=60 >=3.7 实验性
hatchling >=3.7 是
flit-core>=3.4 >=3.6 是
flit-core>=3.2,<3.4 >=3.4 是

请注意,如果您的项目是一个应用程序(即没有 name 元数据),则上述后端的限制不适用。因此,如果您不需要构建后端,您可以使用任何 Python 版本 >=2.7。

从其他包管理器导入项目

如果您已经使用其他包管理工具,如 Pipenv 或 Poetry,那么迁移到 PDM 是很容易的。 PDM 提供了 import 命令,因此您不必手动初始化项目,目前支持:

  1. Pipenv 的 Pipfile
  2. Poetry 在 pyproject.toml 中的部分
  3. Flit 在 pyproject.toml 中的部分
  4. pip 使用的 requirements.txt 格式
  5. setuptools setup.py(这需要在项目环境中安装 setuptools。您可以通过将虚拟环境的 venv.with_pip 配置为 true 来实现,对于 __pypackages__,则使用 pdm add setuptools)

另外,当您执行 pdm init 或 pdm install 时,如果 PDM 项目尚未初始化,PDM 可以自动检测可能需要导入的文件。

!!! 信息 转换 setup.py 将使用项目解释器执行该文件。确保 setuptools 已安装在解释器中,并且 setup.py 是可信的。

使用版本控制系统

必须 提交 pyproject.toml 文件。应该 提交 pdm.lock 和 pdm.toml 文件。不要 提交 .pdm-python 文件。

必须提交 pyproject.toml 文件,因为它包含项目所需的构建元数据和依赖项,PDM 也需要它。 它也通常被其他 Python 工具用于配置。在 Pip 文档 中阅读更多关于 pyproject.toml 文件的信息。

您应该提交 pdm.lock 文件,这样做可以确保所有安装者都使用相同版本的依赖项。 要了解如何更新依赖项,请参阅 更新现有依赖项。

pdm.toml 包含一些项目范围的配置,提交它可能有助于共享。

.pdm-python 存储当前项目使用的 Python 路径,不需要共享。

显示当前 Python 环境

  1. $ pdm info
  2. PDM 版本:
  3. 2.0.0
  4. Python 解释器:
  5. /opt/homebrew/opt/python@3.9/bin/python3.9 (3.9)
  6. 项目根目录:
  7. /Users/fming/wkspace/github/test-pdm
  8. 项目包:
  9. /Users/fming/wkspace/github/test-pdm/__pypackages__/3.9
  10. # 显示环境信息
  11. $ pdm info --env
  12. {
  13. "implementation_name": "cpython",
  14. "implementation_version": "3.8.0",
  15. "os_name": "nt",
  16. "platform_machine": "AMD64",
  17. "platform_release": "10",
  18. "platform_system": "Windows",
  19. "platform_version": "10.0.18362",
  20. "python_full_version": "3.8.0",
  21. "platform_python_implementation": "CPython",
  22. "python_version": "3.8",
  23. "sys_platform": "win32"
  24. }

这个命令 用于检查项目正在使用哪种模式:

现在,您已经设置了一个新 PDM 项目,并获得了 pyproject.toml 文件。参考 元数据部分 了解如何正确编写 pyproject.toml。