簡體   English   中英

如何引用 setup.py 中定義的變量?

[英]How to reference a variable defined in setup.py?

我有以下setup.py

import itertools


dependencies = {
  'minimal': ['numpy', 'requests'],
  'option-a': ['scipy'],
  'option-b': ['matplotlib']
}

setup(
  install_requires=dependencies['minimal'],                           # minimal dependencies
  extras_require={
      'all': list(itertools.chain(*dependencies.values())),           # all dependencies included
      **{k: v for k, v in dependencies.items() if k != 'minimal'},    # each extra dependency group
  },
  # other setup parameters omitted
)

我使用變量dependencies項來避免重復依賴項列表並使其易於維護。 這似乎是個好方法。

我想寫一個 function verify_optional_extras('option-a')來檢查是否安裝了option-a extras 的包。

如果我可以訪問setup.py中定義的dependencies變量,我可以輕松地為這些包編寫驗證 function。

這個問題的可能答案:

  1. 向我展示如何訪問setup.py中的dependencies項。
  2. 告訴我一種組織可選依賴項的更好方法。

如果您想從已安裝的 package 中訪問信息,那么您不應嘗試直接訪問setup.py源,因為它實際上並不存在 一旦您的代碼安裝到站點包中,安裝程序即setup.py文件本身就消失了。 您可以從開發源代碼樹中訪問它,例如 git 簽出,但當您的 package 被其他人安裝和使用時,情況就不一樣了。

對於 wheel 安裝,首先在.whl文件中甚至沒有setup.py 就一個zip的文件,解壓看看吧! 但是缺少setup.py即使在源代碼分發安裝 ( mypkg-1.0.tar.gz ) 或從 pip 安裝的任何東西(它首先構建一個 wheel 文件然后安裝 wheel)的情況下也是如此。

相反,您將需要這樣的東西,以從 package 元數據訪問依賴項數據:

# from within your my_module:
from importlib.metadata import requires
reqs = requires(__package__)

結構有點不同,因此您可能需要將其解析回字典,但所有信息都在那里:

>>> requires("mypkg")
['numpy',
 'requests',
 'numpy; extra == "all"',
 'requests; extra == "all"',
 'scipy; extra == "all"',
 'matplotlib; extra == "all"',
 'scipy; extra == "option-a"',
 'matplotlib; extra == "option-b"']

這些是需求行,如果您在 go 驗證可選的 deps 安裝時需要解析它們的工具,那么您可以使用打包模塊:

>>> from packaging.requirements import Requirement
>>> req = Requirement('scipy >= 1.6; extra == "option-a"')
>>> req.name
'scipy'
>>> req.specifier
<SpecifierSet('>=1.6')>
>>> "1.7.3" in req.specifier
True
>>> "1.5" in req.specifier
False
>>> req.marker
<Marker('extra == "option-a"')>

暫無
暫無

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

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