Skip to content

New Project#

まず、pdm initで新しいプロジェクトを作成します。

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

PDMでpyproject.tomlファイルを作成するには、いくつかの質問に答える必要があります。pdm initのその他の使用方法については、Create your project from a templateを参照してください。

Choose a Python interpreter#

最初に、マシンにインストールされているPythonバージョンのリストからPythonインタプリタを選択する必要があります。インタプリタパスは.pdm-pythonに保存され、後続のコマンドで使用されます。後でpdm useを使用して変更することもできます。

または、PDM_PYTHON環境変数でPythonインタプリタのパスを指定することもできます。これを設定すると、.pdm-pythonに保存されたパスは無視されます。

Using an existing environment

condaによって作成された環境を再利用するなど、既存の環境を使用することを選択した場合、pdm sync--cleanまたはpdm removeを実行すると、PDMはpyproject.tomlまたはpdm.lockにリストされていない依存関係を削除することに注意してください。これは破壊的な結果をもたらす可能性があります。したがって、複数のプロジェクト間で環境を共有しないようにしてください。

Install Python interpreters with PDM#

Added in version 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.install_root設定で指定された場所にPythonインタプリタがインストールされます。

現在インストールされているPythonインタプリタを一覧表示します。

1
pdm python list

インストールされているPythonインタプリタを削除します。:

1
pdm python remove 3.9.8

Share installations with Rye

PDMは、Ryeと同じソースを使用してPythonインタプリタをインストールします。Ryeを同時に使用している場合は、python.install_rootをRyeと同じディレクトリに指定して、Pythonインタプリタを共有できます。:

1
pdm config python.install_root ~/.rye/py

その後、rye toolchainまたはpdm pythonを使用してインストールを管理できます。

Installation strategy based on requires-python#

Added in version 2.16.0

Pythonのversionが指定されていない場合、PDMはpyproject.tomlrequires-pythonに基づいて、現在のプラットフォーム/アーキテクチャの組み合わせに最も適したものをインストールしようとします(pyproject.tomlまたはrequires-python属性が使用できない場合、インストール可能なすべてのPythonインタプリタが考慮されます)。

デフォルトの方法はmaximumです。つまり、最も高いバージョンのcPythonインタプリタがインストールされます。

minimumが優先される場合は、--minオプションを使用し、versionは空のままにしておきます。

1
pdm python install --min

pdm use(自動インストール機能を含む)にも同じ原則が適用され、CI/CDの無人セットアップコマンドや'既存のpyproject.tomlでのフレッシュスタート'ユースケースに適しています。

Virtualenv or not#

If you choose yes, PDM will create a virtual environment in the project root directory, and use it as the Python interpreter for the project.

Pythonインタプリタを選択すると、プロジェクトの仮想環境を作成するかどうかを確認するメッセージが表示されます。[yes]を選択すると、プロジェクトのルートディレクトリに仮想環境が作成され、プロジェクトのPythonインタプリタとして使用されます。

選択したPythonインタプリタが仮想環境にある場合、PDMはそれをプロジェクト環境として使用し、依存関係をそこにインストールします。そうでない場合は、__pypackages__がプロジェクトルートに作成され、依存関係がそこにインストールされます。

これら2つのアプローチの違いについては、ドキュメントの対応するセクションを参照してください。

Library or Application#

ライブラリとアプリケーションは多くの点で異なります。つまり、ライブラリは、他のプロジェクトによってインストールおよび使用されることを目的としたパッケージです。ほとんどの場合、PyPIにもアップロードする必要があります。一方、アプリケーションは、エンド・ユーザーに直接対応するものであり、本番環境にデプロイする必要がある場合があります。

PDMでは、ライブラリの作成を選択すると、nameversionフィールドがpyproject.tomlファイルに追加されます。また、[build-system]テーブルがbuild backendに追加されます。これは、プロジェクトを構築して配布する必要がある場合にのみ役立ちます。そのため、プロジェクトをアプリケーションからライブラリに変更する場合は、これらのフィールドをpyproject.tomlに手動で追加する必要があります。また、--no-selfが指定されていない限り、pdm installまたはpdm syncを実行すると、ライブラリプロジェクトが環境にインストールされます。

pyproject.tomlでは、[tool.pdm]テーブルの下にフィールドdistributionがあります。これがtrueに設定されている場合、PDMはプロジェクトをライブラリとして扱います。

Specify requires-python#

プロジェクトに適切なrequires-python値を設定する必要があります。これは、依存関係の解決方法に影響を与える重要なプロパティです。基本的に、各パッケージのrequires-pythonは、プロジェクトのrequires-pythonの範囲をカバーする必要があります。たとえば、次の設定を考えてみましょう。:

  • Project: requires-python = ">=3.9"
  • Package foo: requires-python = ">=3.7,<3.11"

依存関係を解決するとResolutionImpossibleが発生します:

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

Because the dependency's requires-python is >=3.7,<3.11, it doesn't cover the project's requires-python range of >=3.9. In other words, the project promises to work on Python 3.9, 3.10, 3.11 (and so on), but the dependency doesn't support Python 3.11 (or any higher). Since PDM creates a cross-platform lockfile that should work on all Python versions within the requires-python range, it can't find a valid resolution. To fix this, you need add a maximum version to requires-python, like >=3.9,<3.11.

依存関係のrequires-python>=3.7,<3.11なので、プロジェクトのrequires-pythonの範囲>=3.9はカバーされません。言い換えれば、プロジェクトはPython 3.9、3.10、3.11(など)で動作することを約束していますが、依存関係はPython 3.11(またはそれ以上)をサポートしていません。PDMは、requires-pythonの範囲内のすべてのPythonバージョンで動作するはずのクロスプラットフォームロックファイルを作成するため、有効な解決策を見つけることができません。これを修正するには、>=3.9, <3.11のようにrequires-pythonに最大バージョンを追加する必要があります。

requires-pythonの値は、version specifier as defined in PEP 440です。以下に例を示します。:

requires-python Meaning
>=3.7 Python 3.7 and above
>=3.7,<3.11 Python 3.7, 3.8, 3.9 and 3.10
>=3.6,!=3.8.*,!=3.9.* Python 3.6 and above, except 3.8 and 3.9

Working with older Python versions#

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では動作しないため、リストにのみ記載しています。

Backend Supported Python Support PEP 621
pdm-backend >=3.7 Yes
setuptools>=60 >=3.7 Experimental
hatchling >=3.7 Yes
flit-core>=3.4 >=3.6 Yes
flit-core>=3.2,<3.4 >=3.4 Yes

プロジェクトがアプリケーションである場合(つまり、nameメタデータがない場合)、上記のバックエンドの制限は適用されないことに注意してください。したがって、ビルドバックエンドが必要ない場合は、任意のPythonバージョン>=2.7を使用できます。

Import the project from other package managers#

PipenvやPoetryなどの他のパッケージマネージャツールをすでに使用している場合は、PDMに簡単に移行できます。PDMにはimportコマンドが用意されているため、プロジェクトを手動で初期化する必要はなく、次の機能がサポートされています。

  1. PipenvのPipfile
  2. pyproject.tomlの詩のセクション
  3. pyproject.toml内のフリットのセクション
  4. pipで使用されるrequirements.txt形式
  5. setuptoolssetup.py(プロジェクト環境にsetuptoolsがインストールされている必要があります。これを行うには、venvに対してvenv.with_piptrueに、__pypackages__に対してpdm add setuptoolsを設定します)

また、pdm initまたはpdm installの実行時に、PDMプロジェクトがまだ初期化されていない場合、PDMはインポート可能なファイルを自動検出できます。

Info

setup.pyを変換すると、プロジェクトインタプリタでファイルが実行されます。setuptoolsがインタプリタと一緒にインストールされ、setup.pyが信頼されていることを確認してください。

Working with version control#

pyproject.tomlファイルをコミットする必要がありますpdm.lockおよびpdm.tomlファイルをコミットする必要があります.pdm-pythonファイルは**コミットしないでください。

pyproject.tomlファイルには、PDMに必要なプロジェクトのビルドメタデータと依存関係が含まれているため、コミットする必要があります。また、他のPythonツールの設定にも一般的に使用されています。pyproject.tomlファイルの詳細については、Pip documentationを参照してください。

pdm.lockファイルをコミットする必要があります。これにより、すべてのインストーラが同じバージョンの依存関係を使用していることを確認できます。依存関係を更新する方法については、update existing dependenciesを参照してください。

pdm.tomlにはいくつかのプロジェクト全体の構成が含まれており、共有のためにコミットすると便利です。

.pdm-pythonには、現在のプロジェクトで使用されるPythonパスが保存され、共有する必要はありません。

Show the current Python environment#

 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
$ pdm info
PDM version:
  2.0.0
Python Interpreter:
  /opt/homebrew/opt/python@3.9/bin/python3.9 (3.9)
Project Root:
  /Users/fming/wkspace/github/test-pdm
Project Packages:
  /Users/fming/wkspace/github/test-pdm/__pypackages__/3.9

# Show environment info
$ pdm info --env
{
  "implementation_name": "cpython",
  "implementation_version": "3.8.0",
  "os_name": "nt",
  "platform_machine": "AMD64",
  "platform_release": "10",
  "platform_system": "Windows",
  "platform_version": "10.0.18362",
  "python_full_version": "3.8.0",
  "platform_python_implementation": "CPython",
  "python_version": "3.8",
  "sys_platform": "win32"
}

This commandは、プロジェクトで使用されているモードをチェックするのに便利です。:

  • Project PackagesNoneの場合、virtualenv modeが有効になります。
  • それ以外の場合は、pep582 modeが有効になります。

これで、新しいPDMプロジェクトが設定され、pyproject.tomlファイルが取得されました。pyproject.tomlの適切な記述方法については、metadata sectionを参照してください。