【问题标题】:Python Setup.py - dependency as url to TAR or GITPython Setup.py - 作为 TAR 或 GIT 的 url 的依赖项
【发布时间】:2021-02-05 11:04:22
【问题描述】:

根据我的研究,以下应该有效:

from setuptools import setup
from setuptools import find_packages
...
REQUIRES_INSTALL = [
    'spacy==2.3.2',
    'tensorflow==1.14.0',
    'Keras==2.2.4',
    'keras-contrib@git+https://github.com/keras-team/keras-contrib.git#egg=keras-contrib',
    'en-core-web-sm@https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.0/en_core_web_sm-2.3.0.tar.gz#egg=en-core-web-sm'
]
...
setup(
    name=NAME,
    version=VERSION,
    description=DESCRIPTION,
    install_requires=REQUIRES_INSTALL,
    ...
)

在建造轮子或鸡蛋时,一切都很好:python setup.py bdist_wheel

但是当尝试使用pip install -U dist/mypack-....whl 安装软件包(whl 或 egg)时。

我明白了:

ERROR: Could not find a version that satisfies the requirement keras-contrib (from mypack==0.3.5) (from versions: none)
ERROR: No matching distribution found for keras-contrib (from mypack==0.3.5)
...
ERROR: Could not find a version that satisfies the requirement en-core-web-sm (from mypack==0.3.5) (from versions: none)
ERROR: No matching distribution found for en-core-web-sm (from mypack==0.3.5)

我已经尝试通过setup.cfg 进行相同的操作,但仍然没有运气。


作为参考 - 当首先从 requirments.txt 安装它们然后安装轮子时,所有这些依赖项都可以工作。

spacy==2.3.2
tensorflow==1.14.0
Keras==2.2.4
keras-contrib@git+https://github.com/keras-team/keras-contrib.git#egg=keras-contrib
en-core-web-sm@https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.0/en_core_web_sm-2.3.0.tar.gz#egg=en-core-web-sm
pip install -r requirements.txt
pip install -U dist/mypack-....whl

但这不是干净的方式,因为轮子应该是独立的。

感谢您的任何提示!


环境

  • Python:3.7.0
  • 点数:20.2.4
  • 设置工具:50.3.2

【问题讨论】:

    标签: python dependencies setuptools setup.py


    【解决方案1】:

    前段时间,可以定义一个 requirements.txt 或类似内容,其中包含 PyPI 包的规范以及存储库和档案的链接。

    这需要解析 requirements.txt 并将它们拆分为“requirements”和“dependencies”,其中“requirements”将包含 PyPI 包的定义和“dependencies”——链接。

    Setuptools 对 setup() 有不同的参数:install_requiresdependency_links

    它确实有效:一个人能够定义一个requirements.txt 并将一个包安装为python setup.py installpip install .。此外,可以通过pip install -r requirements.txt 仅安装依赖项。所有方法都有效,并且允许在一个地方定义所有要求,包括非 PyPI 链接。

    但是,自 v19 以来,pip 放弃了对 dependency_links arg 的支持。这是奇怪的部分:setuptools 没有丢弃它。但还有更多。

    从今天开始,pip:

    • 仅支持install_requires
    • 对于包定义 (install_requires) 和独立 requirements.txt 或类似定义中的依赖关系,首选 PEP 508 表示法。
    • 中止安装包,这些包在其install_requires 中包含链接。

    您对依赖项的定义混合了两种符号:keras-contrib@ 等前缀来自 PEP 508,#egg= 部分来自 setuptools 链接符号。

    这不是问题:pip 将忽略“eggs”,因为名称已在 @ 之前定义。

    我相信通过pip 安装软件包可以正常工作,即:

      pip install .
    

    但是,如果通过setuptools 安装软件包,则会出现问题,即:

      python setup.py install
    

    setuptools 不理解 PEP 508 表示法并忽略 install_requires 中的链接。截至今天,要使setuptools 跟随链接,install_requiresdependency_links 都必须使用,例如:

    setup(
       ...
       install_requires=[
          ...
          "keras_contrib==2.0.8",
          ...
       ],
       dependency_links=[
          "https://github.com/keras-team/keras-contrib/tarball/master#egg=keras_contrib-2.0.8",
          ...
       ],
    )
    

    这里有几个棘手的点:

    • 单个依赖项在 2 个位置定义:install_requires 中的包名称和 dependency_links 中的链接以解决包依赖关系。
    • 链接不是git+https://.../....git,而是档案链接:https://.../tarball/...
    • 鸡蛋名称在snake_case,不在dash-case。虽然可以使用 dash-case,但这将不允许指定版本。
    • install_requires 中的版本通过==dependency_links 分隔——通过-
    • 可以省略版本。但唯一可行的用例是如果包不存在于 PyPI 中并且很少更新。如果 PyPI 中存在包,但需要未发布的版本,则必须指定版本。

    这很糟糕:修复setuptools 的链接会破坏pip,因为PEP 508 不允许指定版本。在install_requires 中保留keras-contrib==x.y.z @ ... 将使pip 搜索包keras-contrib==x.y.z,其中==x.y.z 不是版本,而是名称的一部分。同时,不指定版本将使setuptools 获取PyPI 提供的最新版本,而不是dependency_links 的链接。

    在您的情况下,PyPI 中既没有 keras-contrib 也没有 en-core-web-sm,因此在没有指定版本的情况下使用 keras_contrib@git+https://... + dependency_links 可能会起作用。

    否则,如果包依赖于链接,请坚持使用pip install . 并避免使用python setup.py install

    另见:

    琐事:GitHub 上的几个问题仍然开放,PEP 508 自 2015 年以来仍处于 Active 状态。挖掘源代码会发现 setuptools 是 Python 的 distutils 的包装器。 setuptools 不是 Python 的 stdlib 的一部分,但 distutils 的文档暗示 stdlib 文档将在 setuptools 的文档更新后被删除。同时pip 已经作为 Python 的模块与 Python 的安装捆绑在一起。然而,我们有pipfilespipenvpoetrycondapipxpip-toolsshivspack 等等。看起来有点压倒性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多