setup.py& pip:从requirements.txt覆盖依赖项的子依赖项之一

时间:2014-05-31 11:56:34

标签: python python-2.7 pip setup.py requirements.txt

我目前正在开发一个软件包,在我的requirements.txt中,我有一个依赖项:wikipedia。现在,wikipedia 1.3使用requests-2.2.1,而我的包使用版本2.3.0。

另外,正如人们所料,wikipedia-1.3的安装取决于它的依赖性。

但是,如果我开始使用新的virtualenv并直接在我的wikipedia中添加requirements.txt,那么ImportErrorrequests提供了setup.py,因为当时requests-2.3.0运行,setup.py的{​​{1}}除非所有其他人都执行,否则不会执行。在下面的图中,解压缩后setup.py没有 requests

request getting installed but not running setup.py simultaneously

出于某种奇怪的原因,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.pywikipedia
  • 然后'pip install -e。'选项会再次安装我的包和requests-2.2.1

因此首先安装requests-2.3.0,然后由旧版本2.2.1替换,然后再由requests-2.3.0替换。

我尝试了如何克服这个问题的各种规范,但这些令人困惑。我怎么能克服这个混乱?

1 个答案:

答案 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版本。