使用 Python Poetry 進行依賴管理

語言: CN / TW / HK
摘要:在本教程中,您探索瞭如何建立新的 Python Poetry 專案以及如何將 Poetry 新增到現有專案中。

本文分享自華為雲社群《使用 Python Poetry 進行依賴管理》,作者: Yuchuan。

當您的 Python 專案依賴於外部包時,您需要確保使用每個包的正確版本。更新後,軟體包可能無法像更新前那樣工作。Python Poetry 之類的依賴項管理器可幫助您指定、安裝和解析專案中的外部包。通過這種方式,您可以確保始終在每臺機器上使用正確的依賴版本。

使用Poetry將幫助您啟動新專案、維護現有專案並掌握依賴項管理。您將準備好使用pyproject.toml檔案,這將是在 Python 專案中定義構建需求的標準。

要完成本教程並充分利用它,您應該對虛擬環境、模組和包以及pip.

雖然本教程側重於依賴項管理,但 Poetry 還可以幫助您構建和打包專案。如果您想分享您的工作,那麼您甚至可以將您的 Poetry 專案釋出到Python Packaging Index (PyPI)。

注意先決條件

在深入研究 Python Poetry 的細節之前,您需要了解一些先決條件。首先,您將閱讀本教程中將遇到的術語的簡短概述。接下來,您將安裝 Poetry 本身。

相關術語

如果您曾經import在 Python 指令碼中使用過語句,那麼您就已經使用過modules。其中一些模組可能是您自己編寫的 Python 檔案。其他可能是內建模組,例如datetime。但是,有時 Python 提供的還不夠。那時您可能會轉向外部的打包模組。當您的 Python 程式碼依賴於外部模組時,您可以說這些是您專案的依賴項。

您可以在PyPI 中找到不屬於Python 標準庫的包。在瞭解其工作原理之前,您需要在系統上安裝 Poetry。

Python Poetry安裝

要在命令列中使用 Poetry,您應該在系統範圍內安裝它。如果您只是想嘗試一下,那麼您可以使用pip. 但是您應該謹慎嘗試這種方法,因為 Poetry 將安裝自己的依賴項,這可能會與您在專案中使用的其他包衝突。

安裝 Poetry的推薦方法是使用官方install-poetry指令碼。您可以手動下載並執行此Python 檔案,也可以在下方選擇您的作業系統以使用相應的命令:

  • 視窗
  • Linux + macOS
PS C:\> (Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py -UseBasicParsing).Content | python -

如果您使用的是 Windows,那麼您可以使用Invoke-Webrequest帶有-UseBasicParsing選項的cmdlet將請求的 URL 的內容下載到標準輸出流 (stdout)。隨著管道字元(|),你移交輸出到標準輸入流(標準輸入)的python。在這種情況下,您將的內容通過管道install-poetry.py傳輸到 Python 直譯器。

注意:有些使用者在 Windows 10 上使用 PowerShell 命令時會報告錯誤

在輸出中,您應該看到安裝完成的訊息。您可以poetry --version在終端中執行以檢視是否poetry有效。此命令將顯示您當前的 Poetry 版本。如果要更新 Poetry,則可以執行poetry self update.

Python Poetry入門

安裝 Poetry 後,是時候看看 Poetry 是如何工作的了。在本節中,您將學習如何開始一個新的 Poetry 專案以及如何將 Poetry 新增到現有專案中。您還將看到專案結構並檢查pyproject.toml檔案。

建立一個新的Poetry專案

您可以使用new命令和專案名稱作為引數來建立新的 Poetry 專案。在本教程中,該專案稱為rp-poetry. 建立專案,然後進入新建立的目錄:

$ poetry new rp-poetry
$ cd rp-poetry

通過執行poetry new rp-poetry,您可以建立一個名為 的新資料夾rp-poetry/。當您檢視資料夾內部時,您會看到一個結構:

rp-poetry/
│
├── rp_poetry/
│   └── __init__.py
│
├── tests/
│   ├── __init__.py
│   └── test_rp_poetry.py
│
├── README.rst
└── pyproject.toml

Poetry 會自動為您規範化包名。它將-專案名稱中的破折號 ( ) 轉換_為資料夾名稱中的下劃線 ( ) rp_poetry/。否則,Python 中將不允許使用該名稱,因此您無法將其作為模組匯入。為了更好地控制建立包名稱,您可以使用該--name選項以不同於專案資料夾的方式命名:

$ poetry new rp-poetry --name realpoetry

如果您更喜歡將原始碼儲存在額外的src/父資料夾中,那麼 Poetry 可以讓您使用以下--src標誌來遵守該約定:

$ poetry new --src rp-poetry
$ cd rp-poetry

通過新增--src標誌,您建立了一個名為 的資料夾src/,其中包含您的rp_poetry/目錄:

rp-poetry/
│
├── src/
│   │
│   └── rp_poetry/
│       └── __init__.py
│
├── tests/
│   ├── __init__.py
│   └── test_rp_poetry.py
│
├── README.rst
└── pyproject.toml

建立新的 Poetry 專案時,您將立即收到一個基本的資料夾結構。

檢查專案結構

該rp_poetry/子資料夾本身是不是很壯觀呢。在這個目錄中,你會找到一個__init__.py包含你的包版本的檔案:

# rp_poetry/__init__.py

__version__ = "0.1.0"

當您跳到tests/資料夾並開啟 時test_rp_poetry.py,您會注意到它rp_poetry已經是可匯入的:

# tests/test_rp_poetry.py

from rp_poetry import __version__

def test_version():
    assert __version__ == "0.1.0"

Poetry 還為該專案添加了第一個測試。該test_version()函式檢查 的__version__變數是否rp_poetry/__init__.py包含預期的版本。但是,該__init__.py檔案並不是您定義包版本的唯一位置。另一個位置是pyproject.toml檔案。

使用pyproject.toml檔案

使用 Poetry 最重要的檔案之一是pyproject.toml檔案。這個檔案不是 Poetry 的發明。這是 PEP 518 中定義的配置檔案標準:

此 PEP 指定 Python 軟體包應如何指定它們具有的構建依賴項以執行其選擇的構建系統。作為本規範的一部分,為軟體包引入了一個新的配置檔案,用於指定它們的構建依賴項(期望相同的配置檔案將用於未來的配置細節)。(來源)

作者考慮了上面引用中提到的“新配置檔案”的幾種檔案格式。最後,他們決定採用TOML格式,即Tom's Obvious Minimal Language 的縮寫。在他們看來,TOML 足夠靈活,比其他選項(YAML、JSON、CFG 或 INI)具有更好的可讀性和更少的複雜性。要檢視 TOML 的外觀,請開啟pyproject.toml檔案:

 1# pyproject.toml
 2
 3[tool.poetry]
 4name = "rp-poetry"
 5version = "0.1.0"
 6description = ""
 7authors = ["Philipp <[email protected]>"]
 8
 9[tool.poetry.dependencies]
10python = "^3.9"
11
12[tool.poetry.dev-dependencies]
13pytest = "^5.2"
14
15[build-system]
16requires = ["poetry-core>=1.0.0"]
17build-backend = "poetry.core.masonry.api"

您可以在pyproject.toml檔案中看到四個部分。這些部分稱為。它們包含諸如 Poetry 之類的工具識別和用於依賴項管理構建例程的指令。

如果表名是特定於工具的,則必須以tool.為字首。通過使用這樣的子表,您可以為專案中的不同工具新增說明。在這種情況下,只有tool.poetry. 但是,你可能會看到這樣的例子[tool.pytest.ini_options]為pytest在其他專案中。

在[tool.poetry]上面第 3 行的子表中,您可以儲存有關您的 Poetry 專案的一般資訊。您的可用鍵由 Poetry 定義。雖然有些鍵是可選的,但您必須指定四個鍵:

  1. name: 你的包名
  2. version: 包的版本,最好遵循語義版本控制
  3. description:您的包裹的簡短描述
  4. authors: 作者列表,格式 name <email>

第[tool.poetry.dependencies]9 行和[tool.poetry.dev-dependencies]第 12行的子表對於您的依賴項管理至關重要。在下一部分向 Poetry 專案新增依賴項時,您將瞭解有關這些子表的更多資訊。現在,重要的是要認識到的包相關性和發展依賴之間的區別。

該pyproject.toml檔案的最後一個表位於第[build-system]15 行。該表定義了 Poetry 和其他構建工具可以使用的資料,但由於它不是特定於工具的,因此它沒有字首。Poetry 建立了pyproject.toml具有兩個鍵的檔案:

  1. requires:構建包所需的依賴項列表,使此鍵成為必需
  2. build-backend:用於執行構建過程的 Python 物件

如果您想更多地瞭解pyproject.toml檔案的這一部分,那麼您可以通過閱讀PEP 517 中的原始碼樹來了解更多資訊。

當您使用 Poetry 開始一個新專案時,這就是pyproject.toml您開始的檔案。隨著時間的推移,您將新增有關您的包和您正在使用的工具的配置詳細資訊。隨著 Python 專案的增長,您的pyproject.toml檔案也會隨之增長。對於子表[tool.poetry.dependencies]和[tool.poetry.dev-dependencies]. 在下一節中,您將瞭解如何擴充套件這些子表。

使用 Python Poetry

一旦你設定了一個 Poetry 專案,真正的工作就可以開始了。一旦 Poetry 到位,您就可以開始編碼。在此過程中,您將瞭解 Poetry 如何為您提供虛擬環境並處理您的依賴項。

使用 Poetry 的虛擬環境

當您開始一個新的 Python 專案時,建立一個虛擬環境是一種很好的做法。否則,您可能會混淆來自不同專案的不同依賴項。使用虛擬環境是 Poetry 的核心功能之一,它永遠不會干擾您的全域性 Python 安裝。

但是,Poetry 不會在您啟動專案時立即建立虛擬環境。您可以通過讓 Poetry 列出連線到當前專案的所有虛擬環境來確認 Poetry 尚未建立虛擬環境。如果你還沒有,cd進入rp-poetry/然後執行一個命令:

$ poetry env list

目前,不應該有任何輸出。

當您執行某些命令時,Poetry 會一路建立一個虛擬環境。如果您想更好地控制虛擬環境的建立,那麼您可能決定明確告訴 Poetry 您要為其使用哪個 Python 版本,然後從那裡開始:

$ poetry env use python3

使用此命令,您將使用與安裝 Poetry 相同的 Python 版本。使用python3的作品,當你在你的Python可執行程式PATH。

注意:或者,您可以將絕對路徑傳遞給 Python 可執行檔案。它應該與您可以在pyproject.toml檔案中找到的 Python 版本約束相匹配。如果沒有,那麼您可能會遇到麻煩,因為您使用的 Python 版本與專案所需的版本不同。在您的環境中執行的程式碼在另一臺機器上可能有問題。

更糟糕的是,外部包通常依賴於特定的 Python 版本。因此,安裝包的使用者可能會收到錯誤訊息,因為您的依賴項版本與其 Python 版本不相容。

當你執行時env use,你會看到一條訊息:

Creating virtualenv rp-poetry-AWdWY-py3.9 in ~/Library/Caches/pypoetry/virtualenvs
Using virtualenv: ~/Library/Caches/pypoetry/virtualenvs/rp-poetry-AWdWY-py3.9

如您所見,Poetry 為您的專案環境構建了一個唯一名稱。該名稱包含專案名稱和 Python 版本。中間看似隨機的字串是您的父目錄的雜湊值。通過中間的這個唯一字串,Poetry 可以處理系統上具有相同名稱和相同 Python 版本的多個專案。這很重要,因為預設情況下,Poetry 在同一個資料夾中建立所有虛擬環境。

Poetry 無需任何其他配置,在virtualenvs/Poetry快取目錄的資料夾中建立虛擬環境:

如果要更改預設快取目錄,則可以編輯Poetry 的配置。當您已經在使用virtualenvwrapper或其他第三方工具來管理您的虛擬環境時,這會很有用。要檢視當前配置,包括已配置的cache-dir,您可以執行以下命令:

$ poetry config --list

通常,您不必更改此路徑。如果您想了解有關與 Poetry 的虛擬環境互動的更多資訊,那麼 Poetry 文件包含有關管理環境的一章。

只要您在專案資料夾中,Poetry 就會使用與之關聯的虛擬環境。如果您有疑問,可以env list再次執行以下命令檢查虛擬環境是否已啟用:

$ poetry env list

這將顯示類似rp-poetry-AWdWY-py3.9 (Activated). 有了啟用的虛擬環境,您就可以開始管理一些依賴項並看到 Poetry 的魅力了。

宣告你的依賴

Poetry 的一個關鍵元素是它對依賴項的處理。在開始之前,先看一下檔案中的兩個依賴表pyproject.toml:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

當前為您的專案聲明瞭兩個依賴項。一個是 Python 本身。另一個是pytest,一個廣泛使用的測試框架。正如您之前看到的,您的專案包含一個tests/資料夾和一個test_rp_poetry.py檔案。使用pytest作為依賴項,Poetry 可以在安裝後立即執行您的測試。

注意:在編寫本教程時,pytest使用Python 3.10執行Poetry不起作用。Poetry 安裝了一個與 Python 3.10 不相容的 pytest 版本。

Poetry 開發人員已經意識到這個問題,它將隨著 Poetry 1.2 的釋出而得到修復。

確保您在rp-poetry/專案資料夾中並執行命令:

$ poetry install

使用該install命令,Poetry 檢查您的pyproject.toml檔案中的依賴項,然後解析並安裝它們。當您有許多依賴項需要使用不同版本的不同第三方包時,解析部分尤其重要。在安裝任何包之前,Poetry 會確定哪個版本的包滿足其他包設定為其要求的版本限制。

除了pytest它的要求之外,Poetry 還安裝了專案本身。這樣,您可以立即匯入rp_poetry到您的測試中:

# tests/test_rp_poetry.py

from rp_poetry import __version__

def test_version():
    assert __version__ == "0.1.0"

安裝專案包後,您可以匯入rp_poetry測試並檢查__version__字串。隨著pytest安裝,您可以使用poetry run命令來執行測試:

 1$ poetry run pytest
 2========================= test session starts ==========================
 3platform darwin -- Python 3.9.1, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
 4rootdir: /Users/philipp/Real Python/rp-poetry
 5collected 1 item
 6
 7tests/test_rp_poetry.py .                                        [100%]
 8
 9========================== 1 passed in 0.01s ===========================

您當前的測試已成功執行,因此您可以放心地繼續編碼。但是,如果您仔細觀察第 3 行,就會發現有些奇怪。它說pytest-5.4.3,5.2不像pyproject.toml檔案中所說的那樣。接得好!

回顧一下,檔案中的pytest依賴項pyproject.toml如下所示:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dev-dependencies]
pytest = "^5.2"

^前面的插入符號 ( )5.2具有特定的含義,它是 Poetry 提供的版本約束之一。這意味著 Poetry 可以安裝與版本字串最左邊的非零數字匹配的任何版本。這意味著5.4.3允許使用。版本6.0將不被允許。

當 Poetry 嘗試解析依賴版本時,像插入符號這樣的符號將變得很重要。如果只有兩個要求,這並不太難。你宣告的依賴越多,它就越複雜。讓我們看看 Poetry 如何通過將新包安裝到您的專案中來處理這個問題。

安裝帶有 Poetry 的包

您pip之前可能使用過安裝不屬於 Python 標準庫的包。如果您pip install使用包名作為引數執行,則pip在Python Package Index上查詢包。您可以以同樣的方式使用 Poetry。

如果你想在requests你的專案中新增一個外部包,那麼你可以執行一個命令:

$ poetry add requests

通過執行poetry add requests,您正在將最新版本的requests庫新增到您的專案中。您可以使用版本約束,requests<=2.1或者requests==2.24如果您想更具體。當您不新增任何約束時,Poetry 將始終嘗試安裝最新版本的軟體包。

有時,您只想在開發環境中使用某些包。使用pytest,您已經發現其中之一。另一種常見的庫包括一個程式碼格式化像黑色,一個文件生成等斯芬克斯,和類似的一個靜態分析工具pylint的,Flake8,mypy,或coverage.py。

要明確告訴 Poetry 一個包是一個開發依賴項,您可以poetry add使用該--dev選項執行。您還可以使用速記-D選項,它與以下內容相同--dev:

$ poetry add black -D

您新增requests為專案依賴項和black開發依賴項。Poetry 在後臺為您做了一些事情。一方面,它將您宣告的依賴項新增到pyproject.toml檔案中:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.26.0"

[tool.poetry.dev-dependencies]
pytest = "^5.2"
black = "^21.9b0"

Poetry 將該requests包作為專案依賴項新增到tool.poetry.dependencies表中,同時將其black作為開發依賴項新增到tool.poetry.dev-dependencies.

區分專案依賴項和開發依賴項可以防止安裝使用者不需要執行程式的需求。開發依賴項僅與您的包的其他開發人員相關,他們希望pytest使用black. 當用戶安裝您的軟體包時,他們只會安裝requests它。

注意: 您可以更進一步並宣告可選的依賴項。當您想讓使用者選擇安裝一個不需要但增強您的包的特定資料庫介面卡時,這會很方便。您可以在Poetry 文件 中瞭解有關可選依賴項的更多資訊。

除了對pyproject.toml檔案的更改之外,Poetry 還建立了一個名為poetry.lock. 在此檔案中,Poetry 會跟蹤您在專案中使用的所有包和確切版本。

處理 poetry.lock

當您執行該poetry add命令時,Poetry 會自動更新pyproject.toml並固定poetry.lock檔案中的已解析版本。但是,您不必讓 Poetry 完成所有工作。您可以手動向pyproject.toml檔案新增依賴項並在之後鎖定它們。

引腳依賴關係 poetry.lock

如果您想使用 Python 構建網路爬蟲,那麼您可能需要使用Beautiful Soup來解析您的資料。將其新增到檔案中的tool.poetry.dependencies表中pyproject.toml:

# rp_poetry/pyproject.toml (Excerpt)

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.26.0"
beautifulsoup4 = "4.10.0"

通過新增beautifulsoup4 = "4.10.0",您告訴 Poetry 它應該完全安裝這個版本。當您向pyproject.toml檔案新增需求時,它尚未安裝。只要poetry.lock你的專案中沒有檔案存在,你就可以poetry install在手動新增依賴後執行,因為 Poetry 會先查詢poetry.lock檔案。如果沒有找到,Poetry 將解析pyproject.toml檔案中列出的依賴項。

一旦poetry.lock檔案存在,Poetry 將依賴該檔案來安裝依賴項。僅執行poetry install會觸發警告,提示兩個檔案不同步並會產生錯誤,因為 Poetry 尚不知道beautifulsoup4專案中的任何版本。

要將pyproject.toml檔案中手動新增的依賴項固定到poetry.lock,您必須首先執行以下poetry lock命令:

$ poetry lock
Updating dependencies
Resolving dependencies... (1.5s)

Writing lock file

通過執行poetry lock,Poetry 處理pyproject.toml檔案中的所有依賴項並將它們鎖定到poetry.lock檔案中。詩歌並不止於此。執行時poetry lock,Poetry 還會遞迴遍歷並鎖定您的直接依賴項的所有依賴項。

注意:poetry lock如果有適合您的版本限制的新版本可用,該命令還會更新您現有的依賴項。如果您不想更新poetry.lock檔案中已有的任何依賴項,則必須將--no-update選項新增到poetry lock命令中:

$ poetry lock --no-update
Resolving dependencies... (0.1s)

在這種情況下,Poetry 僅解析新的依賴項,但poetry.lock不會更改檔案中的任何現有依賴項版本。

現在您已經固定了所有依賴項,是時候安裝它們以便您可以在您的專案中使用它們。

安裝依賴項 poetry.lock

如果您按照上一節中的步驟操作,那麼您已經安裝pytest並black使用了該poetry add命令。您還鎖定了beautifulsoup4,但您還沒有安裝 Beautiful Soup。要驗證beautifulsoup4尚未安裝,請使用以下命令開啟Python 直譯器poetry run:

$ poetry run python3

執行poetry run python3將在 Poetry 的環境中開啟一個互動式REPL會話。首先,嘗試匯入requests. 這應該完美無缺。然後嘗試 importing bs4,這是 Beautiful Soup 的模組名稱。這應該會引發錯誤,因為尚未安裝 Beautiful Soup:

>>>
>>> import requests
>>> import bs4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'bs4'

正如預期的那樣,您可以requests毫無困難地匯入,並且bs4找不到模組。通過鍵入exit()並點選退出互動式 Python 直譯器Enter。

使用poetry lock命令鎖定依賴項後,您必須執行該poetry install命令,以便您可以在專案中實際使用它們:

$ poetry install
Installing dependencies from lock file

Package operations: 2 installs, 0 updates, 0 removals

  • Installing soupsieve (2.2.1)
  • Installing beautifulsoup4 (4.10.0)

Installing the current project: rp-poetry (0.1.0)

通過執行poetry install,Poetry 讀取poetry.lock檔案並安裝其中宣告的所有依賴項。現在,bs4已準備好在您的專案中使用。要對此進行測試,請輸入poetry run python3並匯入bs4Python 直譯器:

>>>
>>> import bs4
>>> bs4.__version__
'4.10.0'

完美的!這次沒有錯誤,並且您擁有您宣告的確切版本。這意味著 Beautiful Soup 已正確固定在您的poetry.lock檔案中,已安裝在您的專案中,並且可以使用了。要列出專案中的可用包並檢查它們的詳細資訊,您可以使用該show命令。當您使用--help標誌執行它時,您將看到如何使用它:

$ poetry show --help

要檢查包,您可以使用show包名稱作為引數,也可以使用--tree選項將所有依賴項以樹的形式列出。這將幫助您檢視專案的巢狀需求。

更新依賴

為了更新您的依賴項,Poetry 根據兩種情況提供了不同的選項:

  1. 更新版本約束內的依賴項。
  2. 更新版本約束之外的依賴項。

您可以在pyproject.toml檔案中找到版本限制。當新版本的依賴項仍然滿足您的版本限制時,您可以使用以下update命令:

$ poetry update

該update命令將在版本限制內更新所有包及其依賴項。之後,Poetry 將更新您的poetry.lock檔案。

如果你想更新一個或多個特定的包,那麼你可以將它們作為引數列出:

$ poetry update requests beautifulsoup4

使用此命令,Poetry 將搜尋滿足檔案中列出的版本限制的新版本requests和新版本。然後它將解析您專案的所有依賴項並將版本固定到您的檔案中。您的檔案將保持不變,因為列出的約束仍然有效。beautifulsoup4pyproject.tomlpoetry.lockpyproject.toml

如果要使用比pyproject.toml檔案中定義的版本更高的版本來更新依賴項,則需要pyproject.toml事先調整檔案。另一種選擇是add使用版本約束或latest標籤執行命令:

$ poetry add pytest@latest --dev

當您執行add帶有latest標記的命令時,它會查詢包的最新版本並更新您的pyproject.toml檔案。包含latest標籤或版本約束對於使用該add命令至關重要。如果沒有它,您會收到一條訊息,表明該包已存在於您的專案中。另外,不要忘記--dev為開發依賴項新增標誌。否則,您會將包新增到常規依賴項中。

新增新版本後,您必須執行install您在上一節中學到的命令。只有這樣,您的更新才會被鎖定到poetry.lock檔案中。

如果您不確定更新會為您的依賴項引入哪些基於版本的更改,您可以使用該--dry-run標誌。此標誌適用於命令update和add命令。它在您的終端中顯示操作而不執行任何操作。這樣,您可以安全地發現版本更改並決定哪種更新方案最適合您。

區分pyproject.toml和poetry.lock

雖然pyproject.toml檔案中的版本要求可能很寬鬆,但 Poetry 會鎖定您在poetry.lock檔案中實際使用的版本。這就是為什麼在使用Git 時應該提交此檔案的原因。通過poetry.lock在Git 儲存庫中提供檔案,您可以確保所有開發人員都將使用所需軟體包的相同版本。當您遇到包含poetry.lock檔案的儲存庫時,最好使用 Poetry。

使用poetry.lock,您可以確保您使用的版本與其他開發人員使用的版本完全相同。如果其他開發人員不使用 Poetry,您可以將其新增到未使用 Poetry 設定的現有專案中。

將poetry新增到現有專案

很有可能,您的專案不是從poetry new命令開始的。或者,您可能繼承了一個不是用 Poetry 建立的專案,但現在您想使用 Poetry 進行依賴管理。在這些型別的情況下,您可以將 Poetry 新增到現有的 Python 專案中。

新增pyproject.toml到指令碼資料夾

如果您的專案只包含一些 Python 檔案,那麼您仍然可以新增 Poetry 作為未來構建的基礎。在這個例子中,只有一個檔案,hello.py:

# rp-hello/hello.py

print("Hello World!")

這個指令碼唯一能做的就是輸出字串"Hello World!"。但也許這只是一個巨集偉專案的開始,因此您決定將 Poetry 新增到您的專案中。poetry new您將使用以下poetry init命令,而不是使用之前的命令:

$ poetry init

This command will guide you through creating your pyproject.toml config.

Package name [rp-hello]: rp-hello
Version [0.1.0]:
Description []: My Hello World Example
Author [Philipp <[email protected]>, n to skip]:
License []:
Compatible Python versions [^3.9]:

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file

該poetry init命令將啟動互動式會話以建立pyproject.toml檔案。 Poetry 為您提供了大多數需要設定的配置的建議,您可以按下Enter以使用它們。當您不宣告任何依賴項時,pyproject.tomlPoetry 建立的檔案如下所示:

# rp-hello/pyproject.toml

[tool.poetry]
name = "rp-hello"
version = "0.1.0"
description = "My Hello World Example"
authors = ["Philipp <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

內容看起來與您在前幾節中經歷的示例相似。

現在您可以使用 Poetry 專案提供的所有命令。有了pyproject.toml檔案,您現在可以執行指令碼:

$ poetry run python3 hello.py
Creating virtualenv rp-simple-UCsI2-py3.9 in ~/Library/Caches/pypoetry/virtualenvs
Hello World!

因為 Poetry 沒有找到任何可以使用的虛擬環境,所以它在執行您的指令碼之前建立了一個新環境。執行此操作後,它會顯示您的Hello World!訊息而沒有任何錯誤。這意味著您現在有一個正在執行的 Poetry 專案。

使用現有requirements.txt檔案

有時您的專案已經有一個requirements.txt檔案。看看requirements.txt這個Python 網路爬蟲的檔案:

$ cat requirements.txt
beautifulsoup4==4.9.3
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
soupsieve==2.2.1
urllib3==1.26.4

使用該cat實用程式,您可以讀取檔案並將內容寫入標準輸出。在本例中,它顯示了網路爬蟲專案的依賴項。使用 建立 Poetry 專案後poetry init,您可以將該cat實用程式與以下poetry add命令結合使用:

$ poetry add `cat requirements.txt`
Creating virtualenv rp-require-0ubvZ-py3.9 in ~/Library/Caches/pypoetry/virtualenvs

Updating dependencies
Resolving dependencies... (6.2s)

Writing lock file

Package operations: 7 installs, 0 updates, 0 removals

  • Installing certifi (2020.12.5)
  • Installing chardet (4.0.0)
  • Installing idna (2.10)
  • Installing soupsieve (2.2.1)
  • Installing urllib3 (1.26.4)
  • Installing beautifulsoup4 (4.9.3)
  • Installing requests (2.25.1)

當需求檔案像這樣簡單時,使用poetry add和cat可以為您節省一些手動工作。

requirements.txt然而,有時檔案會更復雜一些。在這些情況下,您可以執行測試執行並檢視結果,或者手動將需求新增到檔案中的[tool.poetry.dependencies]表中pyproject.toml。要檢視您的結構pyproject.toml是否有效,您可以在poetry check之後執行。

建立requirements.txt自poetry.lock

在某些情況下,您必須有一個requirements.txt檔案。例如,也許您想在 Heroku 上託管您的 Django 專案。對於這種情況,Poetry 提供了export命令。如果你有一個 Poetry 專案,你可以requirements.txt從你的poetry.lock檔案中建立一個檔案:

$ poetry export --output requirements.txt

poetry export以這種方式使用該命令會建立一個requirements.txt包含雜湊和環境標記的檔案。這意味著您可以確保處理與poetry.lock檔案內容類似的非常嚴格的要求。如果您還想包含您的開發依賴項,您可以新增--dev到命令中。要檢視所有可用選項,您可以選中poetry export --help。

命令參考

本教程向您介紹了 Poetry 的依賴管理。在此過程中,您使用了一些 Poetry 的命令列介面 (CLI) 命令:

您可以檢視Poetry CLI 文件以瞭解有關上述命令和 Poetry 提供的其他命令的更多資訊。您還可以poetry --help直接在終端中執行以檢視資訊!

結論

在本教程中,您探索瞭如何建立新的 Python Poetry 專案以及如何將 Poetry 新增到現有專案中。Poetry 的一個關鍵部分是pyproject.toml檔案。與 結合使用poetry.lock,您可以確保安裝專案所需的每個包的確切版本。當您跟蹤poetry.lockGit 儲存庫中的檔案時,您還要確保專案中的所有其他開發人員在他們的機器上安裝相同的依賴項版本。

 

點選關注,第一時間瞭解華為雲新鮮技術~