我目前正在开发一个软件包,在我的requirements.txt
中,我有一个依赖项:wikipedia
。现在,wikipedia
1.3使用requests-2.2.1
,而我的包使用版本2.3.0。
另外,正如人们所料,wikipedia-1.3
的安装取决于它的依赖性。
但是,如果我开始使用新的virtualenv并直接在我的wikipedia
中添加requirements.txt
,那么ImportError
就requests
提供了setup.py
,因为当时requests-2.3.0
运行,setup.py
的{{1}}除非所有其他人都执行,否则不会执行。在下面的图中,解压缩后setup.py
没有 requests
。
出于某种奇怪的原因,wikipedia
的{{1}}包含setup.py
,后者在安装之前依次导入它的依赖项;但是它通过了CI测试,因为它通过pip单独安装需求,然后运行import wikipedia
。
为了解决这个问题,我制作了一个包含以下内容的设置脚本:
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
。因此首先安装requests-2.3.0
,然后由旧版本2.2.1替换,然后再由requests-2.3.0
替换。
我尝试了如何克服这个问题的各种规范,但这些令人困惑。我怎么能克服这个混乱?
答案 0 :(得分:2)
正如Martijn所指出的那样,正确的方法是在项目中指定最低版本,假设在未来的子依赖版本中保留了完全兼容性。
如果您无法更改需求文件,则可以下载项目并在本地编辑需求文件以指定所需的任何版本。这可以通过pip download
命令完成:
pip download wikipedia==1.3
此外,如果您想在整个过程中使用pip
并保留requests==2.3.0
而不删除并重新安装,则可以指定constraints
文件。这可以通过以下方式完成:
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 freeze
两种情况下都显示:
beautifulsoup4==4.6.0
bs4==0.0.1
requests==2.3.0
wikipedia==1.3.0
注意:这是使用pip 10.0.1测试的,但它应该适用于任何最近的pip版本。