<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          來了!劃時代的 Python 包管理工具 -- PDM

          共 5334字,需瀏覽 11分鐘

           ·

          2022-03-04 18:33

          點擊上方“Python共享之家”,進行關注

          回復“資源”即可獲贈Python學習資料

          金陵津渡小山樓,一宿行人自可愁。
          PDM 是一個新的 Python 的包管理器,也許你還未知曉它的存在,但實際上PDM 已經(jīng)誕生兩年,并在 2021 年發(fā)布 1.0 版本,目前最高的版本是 1.12.8。

          在剛聽到 PDM 時,我下意識認為它是 Python Development Manager,又一個和 Pipenv 和 Poetry 一樣換湯不換藥的虛擬環(huán)境管理工具。

          一直到我翻到了作者的博客,才知道 PDM 的全稱是 Python Development Master,比我想像的還要牛逼一個檔次。

          值得一提的是,PDM 的作者是 PyPa 成員、Pipenv 目前主要的維護者之一,最重要的是,他是中國人,因此這是一款國人開發(fā)的工具。

          # 1. Why PDM?

          早期的包管理器(如 Pipevn,Poetry),都是基于虛擬環(huán)境的,虛擬環(huán)境主要是為了隔離項目開發(fā)環(huán)境,但如果涉及到虛擬 環(huán)境嵌套虛擬環(huán)境,問題就難搞了,經(jīng)常會出現(xiàn)問題。

          PDM 得益于一個 2018 年的 PEP 提案(PEP582,Python local packages directory),完全摒棄了虛擬環(huán)境。

          從作者的博客上來看,當初之所以要重復造個輪子,完全是因為 Pipenv 和 Poetry 都不夠好用,正好有 PEP582 ,可以開發(fā)一個劃時代的 Python 包管理工具,它就是 PDM 。

          PDM 包含如下特性:

          • PEP 582 本地項目庫目錄,支持安裝與運行命令,完全不需要虛擬環(huán)境。

          • 一個簡單且相對快速的依賴解析器,特別是對于大的二進制包發(fā)布。

          • 兼容 PEP 517 的構建后端,用于構建發(fā)布包(源碼格式與 wheel 格式)

          • 擁有靈活且強大的插件系統(tǒng)(有插件系統(tǒng)直接就拉開一個檔次)

          • PEP 621 元數(shù)據(jù)格式

          • 像 pnpm 一樣的中心化安裝緩存,節(jié)省磁盤空間

          盡管 PDM 是國人開發(fā),但考慮到國際化,官網(wǎng)文檔是全英文的。

          我花了整整一天,通讀完文檔,消化了 70% 的 PDM 用法,現(xiàn)將心得整理分享出來,會對你上手 PDM 有幫助。

          關于 PDM,內(nèi)容挺多的,打算分兩篇文章來完整地介紹它:

          • 面向新手的入門級教程

          • 面向骨灰級選手的教程

          本篇是第一篇,先讓大家對 pdm 的基本用法有一個框架性的理解,而 pdm 真正競爭力請持續(xù)關注后續(xù)文章。

          # 2. 安裝 PDM

          PDM 的安裝方法有很多種,在官網(wǎng)上就有 6 種,比如 pip、pipx、homebrew 等

          在以前的文章中,我推薦過 pipx 工具,在安裝那種命令行應用的包時非常好用。

          詳情:使用?pipx?工具安裝命令行工具

          而此時 PDM 就是一個命令行工具,因此我也推薦使用 pipx 安裝,方便統(tǒng)一對命令行進行管理

          執(zhí)行 pipx install pdm 即可安裝

          PDM 只有 Python 3.7+ 的版本才能使用,使用其他的方法安裝,要先保證你的 Python 版本,但使用 pipx 則不需要你去操心。

          # 3. 初始化 PDM

          執(zhí)行 pdm init 就會開始初始化,初始化的時候,會讓你選擇項目的一些信息

          • 是否要上傳 PyPI

          • 依賴的 Python 版本

          • License 類型

          • 作者信息

          • 郵箱信息

          我機器上有 Python ?2.7 和 Python 3.10 兩個版本,在初始化項目時會把機器上的所有 Python 版本都掃描出來了,會讓選擇項目的 Python 版本。

          完成之后,PDM 會將你的選擇以 toml 格式寫入 pyproject.toml 配置文件中。

          # 4. PDM 用法

          pdm 有非常多的命令,使用 -h 可以看到幫助菜單

          ?4.1 安裝包

          和 Poetry 一樣,安裝使用的是 add 命令,但 pdm 的 add 比 poetry 好用,主要體現(xiàn)在分組,具體請關注后續(xù)文章

          ?4.2 查看包

          使用 pdm list 可以以列表形式列出當前環(huán)境已安裝的包

          再加個 --graph 就能以樹狀形式查看,直接依賴包和間接依賴包關系的層級一目了然

          pdm list 還有兩個選項:

          • --freeze:以 requirements.txt 的格式列出已安裝的包

          • --json:以 json 的格式列出已安裝的包,但必須與 --graph 同時使用

          要查看某個包的某體詳情,直接用 pdm show 即可

          ?4.3 刪除包

          刪除包使用的是 remove 命令

          ?4.4 項目配置

          不加任何參數(shù),可以打印出該項目的環(huán)境配置

          想要修改的話,只要加 key 和 value 做為參數(shù)即可,以修改 pypi 鏡像代理為例

          原來上面是豆瓣源,現(xiàn)在我要改成阿里源,只需要執(zhí)行如下命令,可比 poetry 方便多啦~

          pdm config 里面有非常多的配置,想要一一搞清楚的可以去官網(wǎng)查閱:https://pdm.fming.dev/configuration/

          ?4.5 運行命令

          想要在 pdm 的環(huán)境中執(zhí)行命令或者項目,可以使用 ?run 命令,若是執(zhí)行項目時,有諸多參數(shù),可以在 pyproject.toml 配置命令別名,具體用法,請往后看

          ?4.6 查看環(huán)境

          使用 info 命令,可以查看當前項目的環(huán)境信息

          ?4.7 更新包

          更新的話,簡單的場景下,使用下面這兩條即可

          #?更新所有包
          pdm?update?

          #?更新某個包
          pdm?update?

          復雜的場景,pdm 也都為你考慮到了,它提供了很多選項,可以根據(jù)需要使用(以下如有解釋錯誤,請幫忙指正)

          • --save-compatible:項目依賴可兼容的版本

          • --save-wildcard:保存通配符版本(暫不明白)

          • --save-exact:保存有指定確切版本的包

          • --save-minimum:保持最小版本的包

          • --update-reuse:盡量只更新命令行中指定的包,其依賴包能不更新則不更新

          • --update-eager:更新某個包順帶更新其依賴包(遞歸升級)

          • --prerelease:允許提前釋放(暫不明白)

          • --unconstrained:忽略包版本的約束,可將包升級至最新版本

          • --top:僅更新有在 pyproject.toml 的包

          • --dry-run:試運行,而不去修改 lock 文件

          • --no-sync:只更新 lock 文件,但不更新包

          如果你的依賴包有設置分組,還可以指定分組進行更新

          pdm?update?-G?security?-G?http

          也可以指定分組更新分組里的某個包

          pdm?update?-G?security?cryptography

          再加個 -d 就可以再指定 dev 依賴

          #?更新所有的?dev?依賴
          pdm?update?-d

          #?更新?dev?依賴下某個分組的某個包
          pdm?update?-dG?test?pytest

          同樣地,也可以指定 --prod 或者 ?--production 升級非 dev (即生產(chǎn))的包。

          ?4.8 切換 py

          當你在初始化 pdm 項目時,就已經(jīng)選定了當前的 Python 版本和可用的 Python 版本范圍,后面如果想更改,可以使用 use 命令,但版本要受之前設定的版本范圍約束。

          假設允許范圍是 python 3.9+,當前使用的是 python 3.10,可以直接切換過去。

          pdm?use?python3.9

          # 5. 命令別名

          在 pyproject.toml 添加 [tool.pdm.scripts] 可以設置快捷命令別名,若項目的執(zhí)行有非常多的參數(shù),這種設定別名的方法將很有用。

          [tool.pdm.scripts] 有兩種形式

          #?第一種
          [tool.pdm.scripts]
          start?=?"python?main.py"

          #?第一種
          [tool.pdm.scripts]
          start?=?{cmd?=?"python?main.py"}

          但若想在參數(shù)中加注釋,就必須得使用第二種方法,例如這樣

          [tool.pdm.scripts]
          start?=?{cmd?=?[
          ????"flask",
          ????"run",
          ????#?Important?comment?here?about?always?using?port?54321
          ????"-p",?"54321"
          ]}

          除了 cmd 之外,還有兩個參數(shù)

          一個是 shell 參數(shù),從輸出來看你應該和看出和 cmd 的區(qū)別,和 subprocess.Popen() with shell=True 差不多一個意思

          一個是 env_file 參數(shù),可以指定配置環(huán)境變量的文件

          [tool.pdm.scripts]
          start.cmd?=?"flask?run?-p?54321"
          start.env_file?=?".env"

          如果想要把這個環(huán)境變量的文件不僅限于某個命令,而是 pdm run 全局,可以這樣配置

          [tool.pdm.scripts]
          _.env_file?=?".env"

          --list 或者 ?-l可以查看所有設置的快捷別名

          對于每一個快捷命令,都可以設置 pre 和 post 命令:

          • pre 命令:在每次快捷命令執(zhí)行前會執(zhí)行

          • post 命令:在每次快捷命令執(zhí)行后會執(zhí)行

          [tool.pdm.scripts]
          pre_compress?=?"{{?Run?BEFORE?the?`compress`?script?}}"
          compress?=?"tar?czvf?compressed.tar.gz?data/"
          post_compress?=?"{{?Run?AFTER?the?`compress`?script?}}"

          # 6. 自動補全

          pdm 的命令雖多,但并不復雜,并不太需要使用自動補全,若你真的需要補全,也可以實現(xiàn)。

          對于不同的 shell,自動補全的配置方式都不太一樣,這個在官網(wǎng)上有詳細的說明。

          如果你和我一樣使用的 zsh,可以參照我的配置方式。

          截圖中間有一步是 vim ~/.zshrc ,是將 pdm 插件配置到 zsh 中

          plugins=(git?z?macos?extract?zsh-syntax-highlighting?zsh-autosuggestions?pdm)

          # 7. 方案兼容

          ?其他方案遷移到 pdm

          pdm 足夠好用,也足夠開放,如果你當前使用的是其他的包管理器,比如 pipenv ,poetry,或者還在用最原始的 requirements.txt ,你也可以很方便的遷移到 pdm 中來:

          • 使用 pdm import -f {file} 無需初始化,直接轉(zhuǎn)換

          • 執(zhí)行 pdm init 或者 ?pdm install 的時候,會自動識別你當前的依賴情況并轉(zhuǎn)換

          ?pdm 遷移到其他方案

          同樣的,你也可以當 pdm 管理的項目,導出為其他方案

          pyproject.toml 和 pdm.lock是 pdm 的兩個核心文件。

          pdm 做為一個后起之秀,也沒有忘本,它支持:

          • 將 pyproject.toml 轉(zhuǎn)成 setup.py

            pdm?export?-f?setuppy?-o?setup.py
          • 將 pdm.lock 轉(zhuǎn)成 requirements.txt

            pdm?export?-o?requirements.txt

          # 8. 總結一下

          花了很大的力氣,終于把 PDM 的基本用法給介紹完畢,相信一定會有人會提出質(zhì)疑:這就是你所謂的 劃時代的包管理器 ?

          實際上,上面僅僅是入門操作,而 PDM 的一些核心知識,考慮到篇幅有限,我將這些進階類的內(nèi)容安排在后續(xù)文章(請持續(xù)關注我后續(xù)文章),它將包括但不僅限于:

          • PDM 的原理剖析:PEP 582 提案

          • 發(fā)布包的構建:PEP 517 提案

          • Hook 腳本的定義與使用

          • 插件管理系統(tǒng)與自定義插件

          • 緩存管理系統(tǒng)的介紹

          這些內(nèi)容是 PDM 的核心,只有理解了這些,你才能真正用好 PDM,到那時你會感慨:為什么 ?Guido 還不把這樣的工具收編成標準的包管理工具?

          ? ?


          關于包和虛擬環(huán)境管理工具,很多工具我都寫過專門的文章介紹過

          感興趣想系統(tǒng)學習的,可以訪問這個鏈接:https://python.iswbm.com/

          小伙伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。

          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學習群請在后臺回復【

          萬水千山總是情,點個【在看】行不行

          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  老熟女 码A片 | 91色人妻 | 狠狠干天天日 | 中国黄色视频一级片 | 中文字幕有码第一页 |