![](/img/trans.png)
[英]setuptools setup_requires and install_requires behaves differently
[英]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 所必需的),但如果尚未滿足,它將無法滿足該要求。
但是, setuptools
中setup_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.