微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Setup.py-依赖关系为TAR或GIT的网址

如何解决Python Setup.py-依赖关系为TAR或GIT的网址

根据我的研究,以下应该起作用:

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
  • setuptools:50.3.2

解决方法

前段时间,可以定义单个requirements.txt或类似名称,其中包含PyPI软件包的规范以及到存储库和档案的链接。

这需要解析requirements.txt并将其分为“要求”和“依赖项”,其中“要求”将包含PyPI包和“依赖项”的定义-链接。

对于这些setup(),Setuptools具有不同的参数:install_requiresdependency_links

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

但是,自v19起,dependency_links放弃了对pip arg的支持。这是一个奇怪的部分:setuptools并没有删除它。但是还有更多。

截止到今天pip

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

您对依赖项的定义混合了2种表示法:keras-contrib@之类的前缀来自PEP 508,而#egg=部分则由setuptools链接表示法。

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

我相信通过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不允许指定版本。将keras-contrib==x.y.z @ ...保留在install_requires中将使pip搜索包keras-contrib==x.y.z,其中==x.y.z不是版本,而是名称的一部分。同时,不指定版本将使setuptools能够获取PyPI可用的最新版本,而不是dependency_links的链接上的版本。

在您的情况下,PyPI上没有keras-contriben-core-web-sm,因此使用keras_contrib@git+https://... + dependency_links而不指定版本可能有效。

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

另请参阅:

琐事:自2015年以来,GitHub上的几个问题仍然悬而未决,PEP 508仍处于Active状态。对源代码进行挖掘会发现setuptools是Python distutils的包装。 setuptools不是Python的stdlib的一部分,但是distutils的文档意味着setuptools的文档将在更新后删除stdlib文档。同时pip已作为Python的模块与Python的安装捆绑在一起。但是我们有pipfilespipenvpoetrycondapipxpip-toolsshiv,{{3} },其余的。看起来有点不知所措。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。