Skip to content

PEP 582 を使用する#

PEP 582 は拒否されました

これは拒否された PEP です。しかし、この機能が PDM の誕生の理由であるため、PDM はサポートを維持します。 代わりに 仮想環境 を使用することをお勧めします。

PEP 582 を使用すると、依存関係はプロジェクトルートの __pypackages__ ディレクトリにインストールされます。PEP 582 をグローバルに有効にする と、プロジェクトインタープリターを使用してスクリプトを直接実行することもできます。

プロジェクトインタープリターが通常の Python の場合、このモードが有効になります。

さらに、マシン上で初めて作業するプロジェクトに空の __pypackages__ ディレクトリが含まれている場合、PEP 582 が自動的に有効になり、仮想環境は作成されません。

pdm で管理されているプロジェクトで PEP 582 を有効にする#

pdm が仮想環境の代わりに PEP 582 を使用するようにするには、python.use_venv 構成変数を False に設定します:

1
pdm config python.use_venv False

PEP 582 をグローバルに有効にする#

Python インタープリターが PEP 582 パッケージを認識するようにするには、 pdm/pep582/sitecustomize.py を Python ライブラリ検索パスに追加する必要があります。

pdm --pep582 を実行するだけで、環境変数が自動的に変更されます。効果を発揮するには、ターミナルセッションを再起動することを忘れないでください。

環境変数を変更するコマンドは pdm --pep582 [<SHELL>] で表示できます。 <SHELL> が指定されていない場合、PDM はいくつかの推測に基づいて選択します。 eval "$(pdm --pep582)" を実行してコマンドを実行できます。

ログイン時に有効にするために .bash_profile(または同様のプロファイル)に行を追加することをお勧めします。 たとえば、bash では次のようにします:

1
pdm --pep582 >> ~/.bash_profile

再度、効果を発揮するには、ターミナルセッションを再起動することを忘れないでください。

どのように行われますか?

Python の起動時に サイトパッケージの読み込み のおかげで、sys.path をパッチすることが可能です。 PDM に同梱されている sitecustomize.py を実行することで、インタープリターは最も近い __pypackage__ フォルダーを検索し、それを sys.path 変数に追加できます。

IDE を構成して PEP 582 をサポートする#

現在、ほとんどの IDE には PEP 582 の組み込みサポートやプラグインがないため、ツールを手動で構成する必要があります。

PyCharm#

__pypackages__/<major.minor>/libソースルート としてマークします。 次に、Python インタープリター として同じ <major.minor> バージョンの Python インストールを選択します。

さらに、環境からツール(例: pytest)を使用したい場合は、対応する実行/デバッグ構成の PATH 変数に __pypackages__/<major.minor>/bin ディレクトリを追加する必要があります。

VSCode#

.vscode/settings.json のトップレベルの dict に次の 2 つのエントリを追加します:

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

このファイルは、プラグイン pdm-vscode で自動生成できます。

PEP582 をグローバルに有効にする、 そして、VSCode が PEP582 を有効にしたユーザーとシェルを使用して実行されていることを確認してください。

PEP582 をグローバルに有効にできませんか?

何らかの理由で PEP582 をグローバルに有効にできない場合でも、各プロジェクトでそれぞれの "launch" を構成できます: PYTHONPATH 環境変数を .vscode/launch.json の起動構成に設定します。 たとえば、pytest の実行をデバッグするには次のようにします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
    "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 に追加します:

1
"env": {"PYTHONPATH": "src:__pypackages__/<major.minor>/lib"}
Pylance/Pyright を使用していますか?

"python.analysis.diagnosticMode": "workspace" を構成していて、 その結果として大量のエラー/警告が表示される場合。 ワークスペースディレクトリに pyrightconfig.json を作成し、次のフィールドを入力する必要があります:

1
2
3
{
    "exclude": ["__pypackages__"]
}

その後、言語サーバーまたは VS Code を再起動すれば完了です。 将来的には (microsoft/pylance-release#1150)、問題が解決されるかもしれません。

Jupyter Notebook を使用していますか?

pdm を使用して jupyter notebook をインストールし、python 拡張機能と一緒に vscode で使用したい場合:

  1. pdm add notebook などを使用して notebook をインストールします
  2. プロジェクトディレクトリ内に次のような内容の .env ファイルを追加します:
1
PYTHONPATH=/your-workspace-path/__pypackages__/<major>.<minor>/lib

上記がまだ機能しない場合は、Notebook の起動時に環境変数が正しく読み込まれていない可能性があります。次の 2 つの回避策があります。

  1. ターミナルで code . を実行します。これにより、パスが正しく設定された状態で現在のディレクトリに新しい VSCode ウィンドウが開きます。新しいウィンドウで Jupyter Notebook を使用します
  2. 新しいウィンドウを開きたくない場合は、Jupyter Notebook の冒頭で次のようにパスを明示的に設定します:
1
2
import sys
sys.path.append('/your-workspace-path/__pypackages__/<major>.<minor>/lib')

参考問題

PDM タスクプロバイダー

さらに、VSCode タスクプロバイダー拡張機能 がダウンロード可能です。

これにより、VSCode が pdm スクリプト を自動的に検出し、 VSCode タスク としてネイティブに実行できるようになります。

Neovim#

neovim-lsp を使用していて pyright を使用しており、__pypackages__ ディレクトリをパスに追加したい場合は、 プロジェクトの pyproject.toml に次のように追加できます。

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

Emacs#

いくつかのオプションがありますが、基本的には LSP クライアントに __pypackages__ を検索するパスに追加するように指示する必要があります。以下は利用可能なオプションのいくつかです:

pyproject.toml と pyright を使用する#

プロジェクトの pyproject.toml に次のように追加します:

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

eglot + pyright#

pyrighteglot(Emacs 29 に含まれています)を使用する場合、設定に次のように追加します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(defun get-pdm-packages-path ()
  "現在の PDM プロジェクトのパッケージのパスを見つけます。"
  (let ((packages-path (string-trim (shell-command-to-string "pdm info --packages"))))
    (concat packages-path "/lib")))

(defun my/eglot-workspace-config (server)
  "現在の PDM プロジェクトのために、動的に Python LSP 構成を生成します。"
  `(:python\.analysis (:extraPaths ,(vector (get-pdm-packages-path)))))

(setq-default eglot-workspace-configuration #'my/eglot-workspace-config)

pyright をグローバルにインストールするか、プロジェクトにインストールする必要があります(おそらく開発依存関係として)。次のように追加できます:

1
pdm add --dev --group devel pyright

LSP-Mode + lsp-python-ms#

以下は、Emacs で lsp-python-ms を使用して PDM を動作させる方法を示すサンプルコードスニペットです。@linw1995 によって提供されました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  ;; TODO: 結果をキャッシュする
  (defun linw1995/pdm-get-python-executable (&optional dir)
    (let ((pdm-get-python-cmd "pdm info --python"))
      (string-trim
       (shell-command-to-string
        (if dir
            (concat "cd "
                    dir
                    " && "
                    pdm-get-python-cmd)
          pdm-get-python-cmd)))))

  (defun linw1995/pdm-get-packages-path (&optional dir)
    (let ((pdm-get-packages-cmd "pdm info --packages"))
      (concat (string-trim
               (shell-command-to-string
                (if dir
                    (concat "cd "
                            dir
                            " && "
                            pdm-get-packages-cmd)
                  pdm-get-packages-cmd)))
              "/lib")))

  (use-package lsp-python-ms
    :ensure t
    :init (setq lsp-python-ms-auto-install-server t)
    :hook (python-mode
           . (lambda ()
               (setq lsp-python-ms-python-executable (linw1995/pdm-get-python-executable))
               (setq lsp-python-ms-extra-paths (vector (linw1995/pdm-get-packages-path)))
               (require 'lsp-python-ms)
               (lsp))))  ; または lsp-deferred