使用 PEP 582#

使用 PEP 582,依赖项将被安装到项目根目录下的 __pypackages__ 目录中。在全局启用 PEP 582 后,还可以使用项目解释器直接运行脚本。

当项目解释器为普通 Python 时,启用该模式。

此外,在您的机器上第一次使用的项目中,如果它包含空的 __pypackages__ 目录,PEP 582 将自动启用,并且不会创建虚拟环境。

全局启用 PEP 582#

要使 Python 解释器知道 PEP 582 包,需要将 pdm/pep582/sitecustomize.py 添加到 Python 库搜索路径。

只需要执行 pdm --pep582,环境变量就会自动改变。不要忘记重新启动终端会话以使其生效。

修改环境变量的命令可以通过 pdm --pep582 [<SHELL>] 打印。如果没有给出 <SHELL>, PDM 将根据一些猜测选择一个。可通过 eval "$(pdm --pep582)" 命令执行。

您可能希望在 .bash_profile (或类似的概要文件)中写入一行,以便在登录时生效。例如,在 bash 中你可以这样做:

pdm --pep582 >> ~/.bash_profile

再次强调,不要忘记重新启动终端会话以使其生效。

这是怎么做到的?

感谢在 Python 启动时加载的 site。可以通过执行 PDM 附带的 sitecustomize.py 来修补 sys.path。解释器可以在目录中搜索最近的 __pypackage__ 文件夹,并将其附加到 sys.path 变量。

配置 IDE 以支持 PEP 582#

现在大多数 IDE 中都没有对 PEP 582 的内置支持或插件,您必须手动配置您的工具。

PDM 会在 .pdm.toml 中写入并存储整个项目的配置,建议你在 .gitignore 中添加以下几行:

.pdm.toml
__pypackages__/

PDM VSCode#

.vscode/settings.json 的顶层 dict 中添加以下两个条目:

{
  "python.autoComplete.extraPaths": ["__pypackages__/<major.minor>/lib"],
  "python.analysis.extraPaths": ["__pypackages__/<major.minor>/lib"]
}

这个文件可以用 pdm-vscode 插件自动生成。

全局范围内启用 PEP 582,并确保 VSCode 使用与你启用 PEP582 相同的用户和 Shell 运行。

无法在全局启用 PEP582?

如果由于某种原因不能全局启用 PEP 582,您仍然可以在每个项目中配置每个 “launch”:在 .vscode/launch.json 中,在启动配置中设置 PYTHONPATH 环境变量。例如,要调试 pytest 运行:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "pytest",
            "type": "python",
            "request": "launch",
            "module": "pytest",
            "args": ["tests"],
            "justMyCode": false,
            "env": {"PYTHONPATH": "__pypackages__/<major.minor>/lib"}
        }
    ]
}

如果你的包位于 src 目录中,也要将它添加到 PYTHONPATH

"env": {"PYTHONPATH": "src:__pypackages__/<major.minor>/lib"}

如何使用 Pylance/Pyright?

如果你已经配置了 "python.analysis.diagnosticMode": "workspace",您会看到大量的错误/警告。您可能需要在工作空间目录下创建 pyrightconfig.json,填写以下字段:

{
    "exclude": ["__pypackages__"]
}

然后重新启动语言服务器或 VS Code,就可以开始了。在将来(microsoft/pylance-release#1150),也许这个问题会得到解决。

如何使用 Jupyter Notebook?

如果你想使用 pdm 来安装 jupyter notebook,并在 vscode 中与 python 扩展一起使用:

  1. 使用 pdm add notebook 或者直接安装 notebook

  2. 在项目目录中添加 .env 文件,内容如下:

PYTHONPATH=/your-workspace-path/__pypackages__/<major>.<minor>/lib

如果上述方法仍然不起作用,很可能是因为在 Notebook 启动时没有正确加载环境变量。有两种变通办法。

  1. 在终端运行 code .。它将在当前目录中打开新的 VSCode 窗口,路径设置正确。在新窗口中使用 Jupyter Notebook

  2. 如果你不想打开新窗口,在 Jupyter Notebook 的开头运行以下命令显式设置路径:

import sys
sys.path.append('/your-workspace-path/__pypackages__/<major>.<minor>/lib')

PDM Task Provider

此外,还有 VSCode 任务提供者 扩展可供下载。

这使得 VSCode 可以自动检测 pdm 脚本,从而使它们可以作为 VSCode 任务原生运行。

PDM PyCharm#

Mark __pypackages__/<major.minor>/lib as Sources Root. Then, select as Python interpreter a Python installation with the same <major.minor> version.

Additionally, if you want to use tools from the environment (e.g. pytest), you have to add the __pypackages__/<major.minor>/bin directory to the PATH variable in the corresponding run/debug configuration.

PDM Neovim#

If using neovim-lsp with pyright and want your __pypackages__ directory to be added to the path, you can add this to your project’s pyproject.toml.

[tool.pyright]
extraPaths = ["__pypackages__/<major.minor>/lib/"]