PDM 是一個比pipenv 或者 poetry 更好的 Python 包管理器

https://github.com/pdm-project/pdm/blob/main/README_zh.md

這個項目是啥?

PDM 旨在成爲下一代 Python 軟件包管理工具。它最初是爲個人興趣而誕生的。如果你覺得 pipenv 或者 poetry 用着非常好,並不想引入一個新的包管理器,那麼繼續使用它們吧;但如果你發現有些東西這些 工具不支持,那麼你很可能可以在 pdm 中找到。

PEP 582 提出下面這種項目的目錄結構:

foo
    __pypackages__
        3.8
            lib
                bottle
    myscript.py

項目目錄中包含一個__pypackages__目錄,用來放置所有依賴的庫文件,就像npmnode_modules一樣。 你可以在這裏閱讀更多提案的細節。

主要特性

  • PEP 582 本地項目庫目錄,支持安裝與運行命令,完全不需要虛擬環境。
  • 一個簡單且相對快速的依賴解析器,特別是對於大的二進制包發佈。
  • 兼容 PEP 517 的構建後端,用於構建發佈包(源碼格式與 wheel 格式)
  • 具備一個完備的插件系統
  • PEP 621 元數據格式

爲什麼不用虛擬環境?

現在大部分的 Python 包管理器也同時管理虛擬環境,這主要是爲了隔離項目開發環境。但如果涉及到虛擬 環境嵌套虛擬環境的時候,問題就來了:你可能用一個虛擬環境的 Python 安裝了某個虛擬環境管理工具, 然後又用這個工具去創建更多虛擬環境。當某一天你升級了新版本的 Python 你必須一個一個去檢查這些 虛擬環境,沒準哪個就用不了了。

然而 PEP 582 提供了一個能把 Python 解釋器和項目開發環境解耦的方法。這是一個相對比較新的提案, 沒有很多相關的工具實現它,這其中就有 pyflow。但 pyflow 又是用 Rust 寫的,不是所有 Python 的社區 都會用 Rust,這樣就沒法貢獻代碼,而且,基於同樣的原因,pyflow 並不支持 PEP 517 構建。

安裝

PDM 需要 Python 3.7 或更高版本。

通過安裝腳本

像 pip 一樣,PDM 也提供了一鍵安裝腳本,用來將 PDM 安裝在一個隔離的環境中。

Linux/Mac 安裝命令

curl -sSL https://raw.githubusercontent.com/pdm-project/pdm/main/install-pdm.py | python -

Windows 安裝命令

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/pdm-project/pdm/main/install-pdm.py -UseBasicParsing).Content | python -

默認情況下,此腳本會將 PDM 安裝在 Python 的用戶目錄下,具體位置取決於當前系統:

  • Unix 上是 $HOME/.local/bin
  • Windows 上是 %APPDATA%\Python\Scripts

你還可以通過命令行的選項來改變安裝腳本的行爲:

usage: install-pdm.py [-h] [-v VERSION] [--prerelease] [--remove] [-p PATH] [-d DEP]

optional arguments:
  -h, --help            show this help message and exit
  -v VERSION, --version VERSION | envvar: PDM_VERSION
                        Specify the version to be installed, or HEAD to install from the main branch
  --prerelease | envvar: PDM_PRERELEASE    Allow prereleases to be installed
  --remove | envvar: PDM_REMOVE            Remove the PDM installation
  -p PATH, --path PATH | envvar: PDM_HOME  Specify the location to install PDM
  -d DEP, --dep DEP | envvar: PDM_DEPS     Specify additional dependencies, can be given multiple times

你既可以通過直接增加選項,也可以通過設置對應的環境變量來達到這一效果。

其他安裝方法

如果你使用的是 MacOS 並且安裝了 homebrew

$ brew install pdm

如果你在 Windows 上使用 Scoop, 運行以下命令安裝:

PS> scoop bucket add frostming https://github.com/frostming/scoop-frostming.git
PS> scoop install pdm

否則,強烈推薦把 pdm 安裝在一個隔離環境中, 用 pipx 是墜吼的。

$ pipx install pdm

或者你可以將它安裝在用戶目錄下:

$ pip install --user pdm

快速上手

初始化一個新的 PDM 項目

$ pdm init

按照指引回答提示的問題,一個 PDM 項目和對應的pyproject.toml文件就創建好了。

把依賴安裝到 __pypackages__ 文件夾中

$ pdm add requests flask

你可以在同一條命令中添加多個依賴。稍等片刻完成之後,你可以查看pdm.lock文件看看有哪些依賴以及對應版本。

 PEP 582 加持下運行你的腳本

假設你在__pypackages__同級的目錄下有一個app.py腳本,內容如下(從 Flask 的官網例子複製而來):

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

如果你使用的是 Bash,可以通過執行eval "$(pdm --pep582)"設置環境變量,現在你可以用你最熟悉的 Python 解釋器 運行腳本了:

$ python /home/frostming/workspace/flask_app/app.py
 * Serving Flask app "app" (lazy loading)
 ...
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

噹噹噹當!你已經把應用運行起來了,而它的依賴全被安裝在一個項目獨立的文件夾下,而我們完全沒有創建虛擬環境。

如果你是 Windows 用戶,請參考文檔獲取設置的方法。

如果你好奇這是如何實現的,可以查看文檔,有一個簡短的解釋。

徽章

在 README.md 中加入以下 Markdown 代碼,向大家展示項目正在使用 PDM:

[![pdm-managed](https://img.shields.io/badge/pdm-managed-blueviolet)](https://pdm.fming.dev)

pdm-managed

PDM 生態

Awesome PDM 這個項目收集了一些非常有用的 PDM 插件及相關資源。

常見問題

1. __pypackages__ 裏都包含什麼?

PEP 582 尚處於草案階段,還需要補充很多細節,比如提案中並未說明可執行程序應該如何存放。PDM 會把 bin(可執行程序), include(頭文件), 以及 lib 都放在 __pypackages__/X.Y 下面。

2. 如何運行 __pypackages__ 下的可執行程序?

推薦的方式是在你的命令前面加上 pdm run, 你也可以直接運行 bin 下面的可執行程序。PDM 的安裝器已經在可執行程序裏面注入了本地包路徑了。

3. 使用 PDM 時會載入哪些三方庫路徑?

本項目的 __pypackages__ 中的包會在系統的site-packages之前被載入,這樣能更好地隔離包的環境。

4. 我能把 __pypackages__ 保存下來用來部署到別的機器上嗎?

最好別這樣搞,__pypackages__ 下面安裝的包是和操作系統相關的,所以除非是純 Python 的包,都會有兼容性的問題。你應該把 pdm.lock 納入版本管理,然後在目標環境中執行 pdm sync

5. 我能用pdm管理一個 Python 2.7 的項目嗎?

當然可以。只是pdm本身的安裝需要 Python 版本高於 3.7,它並不限制項目使用的 Python 版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章