如何解决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_requires
和dependency_links
。
它确实有效:一个人能够定义requirements.txt
并以python setup.py install
和pip 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_requires
和dependency_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-contrib
和en-core-web-sm
,因此使用keras_contrib@git+https://...
+ dependency_links
而不指定版本可能有效。
否则,请坚持使用pip install .
,如果软件包依赖链接,请避免使用python setup.py install
。
另请参阅:
- PEP 508
- PEP508: why either version requirement or URL but not both?
- How can I make setuptools install a package that's not on PyPI?
- pip install dependency links
- pip3 setup.py install_requires PEP 508 git URL for private repo
- Why is dependency links in setup.py deprecated?
- Changing PEP 508 URLs in setup.py doesn't reinstall the dependency
- Updating remote links with new URLs for PEP508 functionality
- Requirements using PEP 508 direct references ignore the URL
- Suggest alternatives for --process-dependency-links
- Un-deprecate
--process-dependency-links
until an alternative is implemented - Changes to the pip dependency resolver in 20.3 (2020)
琐事:自2015年以来,GitHub上的几个问题仍然悬而未决,PEP 508仍处于
Active
状态。对源代码进行挖掘会发现setuptools是Python distutils的包装。setuptools
不是Python的stdlib的一部分,但是distutils
的文档意味着setuptools
的文档将在更新后删除stdlib文档。同时pip
已作为Python的模块与Python的安装捆绑在一起。但是我们有pipfile
s,pipenv
,poetry
,conda
,pipx
,pip-tools
,shiv
,{{3} },其余的。看起来有点不知所措。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。