簡體   English   中英

setuptools 是否應該在 setup.cfg 文件的 setup_requires 條目中?

[英]Should setuptools be in the setup_requires entry of setup.cfg files?

importlib_resources標准庫模塊的 Python < 3.7 的importlib.resources在 setup.cfg 文件中有以下部分:

[options]
python_requires = >=2.7,!=3.0,!=3.1,!=3.2,!=3.3
setup_requires =
    setuptools
    wheel
install_requires =
    pathlib2; python_version < '3'
    typing; python_version < '3.5'
packages = find:

為什么setup_requires包含setuptools 這似乎沒有意義,因為:

  • setup.py 文件的第一行導入setuptools ,因此當調用setup function 並讀取指示安裝setuptools的 setup.cfg 文件時,安裝setuptools已經太晚了:

     from setuptools import setup setup()
  • setuptools已安裝在任何新的 Python 安裝上(好吧,僅在 Windows 10 和 MacOS 10.15 上使用 ZA7F5F35426B927411FC9231B50382173Z 3 進行了測試):

     $ python -V Python 3.8.0 $ pip list Package Version ---------- ------- pip 19.2.3 setuptools 41.2.0 WARNING: You are using pip version 19.2.3, however version 19.3.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.

接受的答案大多是正確的,但是 PEP 518 說的。

[ setup_requires機制] 不能包含setuptools本身...

它在技術上是不正確的,正如importlib_resources展示的,它實際上可以包含setuptools 問題是在setup_requires中包含setuptools主要用作文檔。 它聲明setuptools是構建要求(運行 setup.py 所必需的),但如果尚未滿足,它將無法滿足該要求。

但是, setuptoolssetup_requires的存在在技術上是正確的,並且確實用於聲明需求並要求 setuptools 驗證該需求是否確實已安裝(以及其他設置時要求)。

然而,它只是一個遺留工件,並沒有提供那么多價值,而且從問題和答案中可以看出,它確實會導致混亂。 推薦的、正確的方法是使用 PEP 517 和 518 聲明和構建器,但是生態系統的那部分還沒有成熟,所以 setuptools 的痕跡會保留下來。 盡量不要讓他們打擾你。

不,根據PEP 518 (粗體強調我的), setuptools不應包含在setup_requires中:

Setuptools 試圖通過setup() function [3] 的setup_requires參數來解決這個問題。 該解決方案存在許多問題,例如:

  • 沒有任何工具(除了 setuptools 本身)可以在不執行setup.py的情況下訪問此信息,但是setup.py不能在沒有安裝這些項目的情況下執行。
  • 雖然 setuptools 本身將安裝此處列出的任何內容,但它們直到setup() function 執行期間才會安裝,這意味着實際使用此處添加的任何內容的唯一方法是通過越來越復雜的機制來延遲導入和使用這些模塊直到稍后執行setup() function。
  • 這不能包括setuptools本身,也不能包括setuptools的替代品,這意味着諸如numpy.distutils類的項目在很大程度上無法使用它,並且項目無法利用較新的 setuptools 功能,直到他們的用戶自然地將 setuptools 的版本升級到較新的版本一。
  • 每當您執行setup.py時, setup_requires中列出的項目都會隱式安裝,但setup.py執行的一種常見方式是通過另一個工具,例如pip ,該工具已經在管理依賴項。 這意味着像pip install spam這樣的命令可能最終會導致 pip 和 setuptools 下載和安裝軟件包,最終用戶需要配置這兩個工具(對於setuptools而不是控制調用)來更改設置,例如從哪個存儲庫安裝. 這也意味着用戶需要了解這兩種工具的發現規則,因為一種工具可能支持不同的 package 格式或以不同的方式確定最新版本。

為什么 setup_requires 包含 setuptools? 這似乎沒有意義

根本沒有意義。 另一方面,它不會妨礙任何事情,為什么不呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM