Python setup.py&;pip:覆盖其中一个依赖项';s requirements.txt中的子依赖项
我目前正在处理一个包,在我的Python setup.py&;pip:覆盖其中一个依赖项';s requirements.txt中的子依赖项,python,python-2.7,pip,setup.py,requirements.txt,Python,Python 2.7,Pip,Setup.py,Requirements.txt,我目前正在处理一个包,在我的requirements.txt中,我有一个依赖项:wikipedia。现在,wikipedia1.3使用requests-2.2.1,而我的软件包使用的是2.3.0版 此外,正如人们所料,wikipedia-1.3的安装取决于它的依赖关系 但是,如果我启动一个新的virtualenv并直接在我的requirements.txt中包含wikipedia,它会在请求上提供一个ImportError,因为在setup.py运行时,requests-2.3.0的setup.
requirements.txt
中,我有一个依赖项:wikipedia
。现在,wikipedia
1.3使用requests-2.2.1
,而我的软件包使用的是2.3.0版
此外,正如人们所料,wikipedia-1.3
的安装取决于它的依赖关系
但是,如果我启动一个新的virtualenv并直接在我的requirements.txt
中包含wikipedia
,它会在请求上提供一个ImportError
,因为在setup.py
运行时,requests-2.3.0
的setup.py
不会执行,除非所有其他人都执行。在下图中,解包后,请求
没有运行setup.py
出于某种奇怪的原因,wikipedia
的setup.py
包含import wikipedia
,这反过来又会在安装之前导入它的依赖项;但是,它通过了CI测试,因为它通过pip单独安装需求,然后运行setup.py
为了克服这种情况,我制作了一个设置脚本,包括:
pip install -r requirements.txt
pip install wikipedia
pip install -e .
- 这将安装
requests-2.3.0
和beautifulsoup4
李>
- 然后安装
wikipedia
(然后可以运行setup.py
并安装wikipedia
和requests-2.2.1
)
- 然后“pip install-e.”选项再次安装我的软件包以及
requests-2.3.0
因此,requests-2.3.0
首先被安装,然后被旧版本2.2.1取代,然后又被2.3.0
取代
我试着通过各种规格说明来克服这个问题,但这些都是令人困惑的。如何克服这种混乱?正如Martijn所指出的,正确的方法是在项目中指定一个最低版本,假设子依赖项的未来版本中保留了完全兼容性
如果无法更改需求文件,则可以下载项目并在本地编辑需求文件,以指定所需的任何版本。这可以通过pip下载
命令完成:
pip download wikipedia==1.3
此外,如果您希望在整个过程中使用pip
,并保留requests==2.3.0
,而不删除并重新安装,则可以指定约束
文件。这可以通过以下方式实现:
pip install -c constraints.txt wikipedia==1.3
其中constraints.txt包含以下内容:
requests>=2.3.0
beautifulsoup4
这将产生警告,但将安装wikipedia
程序包:
wikipedia 1.3.0 has requirement requests==2.2.1, but you'll have requests 2.3.0 which is incompatible.
Installing collected packages: wikipedia
Successfully installed wikipedia-1.3.0
现在,如果您真的知道自己在做什么(或者只是想尝试一下,如果它有效的话),您可以使用--no deps
标志,它将完全忽略包依赖项,并且不会产生上面的警告:
pip install --no-deps -c constraints.txt wikipedia==1.3
在这两种情况下,pip冻结
显示:
beautifulsoup4==4.6.0
bs4==0.0.1
requests==2.3.0
wikipedia==1.3.0
注意:这是用pip 10.0.1测试的,但它应该适用于任何最新的pip版本。解决这一问题的正确方法是告诉wikipedia
项目不要依赖特定的版本,而是指定一个最低版本。是的,我已经这样做了,但仍然希望有办法覆盖它。还有,为什么解包后“requests”模块没有显示“running setup.py”?我大量更新了你文章的格式。尽量避免不必要的强调,在适用的地方使用代码标签。也不要使用图像显示代码输出。这使得搜索引擎(以及未来的读者)更难(如果不是不可能的话)找到这篇文章。相反,将控制台输出复制到您的帖子中。谢谢Bram。感谢您的努力。来自“只想尝试”区域的干杯