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

arc*_*ife 11 python pip setup.py python-2.7 requirements.txt

我正在开发一个软件包,在我的工作中requirements.txt,我有一个依赖:wikipedia.现在,wikipedia1.3使用requests-2.2.1我的包使用版本2.3.0.

此外,正如人们所预料的那样,wikipedia-1.3安装取决于它的依赖性.

但是,如果我开始一个新的virtualenv和直接包括wikipedia在我的requirements.txt,它提供了一个ImportErrorrequests,因为当时的setup.py运行,requests-2.3.0setup.py不执行,除非所有其他执行.在下面附的图,有没有运行setup.pyrequests它就会被解开了.

请求已安装但未同时运行setup.py

出于某种奇怪的原因,wikipediasetup.py包含import wikipedia,这反过来进口它的依赖他们甚至在安装之前; 然而,它通过了CI测试,因为它通过pip单独安装需求然后运行setup.py.

为了解决这个问题,我制作了一个包含以下内容的安装脚本:

pip install -r requirements.txt
pip install wikipedia
pip install -e .
Run Code Online (Sandbox Code Playgroud)
  • 这安装requests-2.3.0beautifulsoup4;
  • 然后安装wikipedia(其然后可以运行setup.py并安装wikipediarequests-2.2.1)
  • 然后'pip install -e.' 选项requests-2.3.0再次安装我的包.

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

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

Mar*_*gov 6

正如 Martijn 所指出的,正确的方法是在项目中指定一个最低版本,假设在子依赖项的未来版本中保留了完全兼容性。

如果您无法更改需求文件,您可以下载项目并在本地编辑需求文件以指定您想要的任何版本。这可以通过以下pip download命令完成:

pip download wikipedia==1.3
Run Code Online (Sandbox Code Playgroud)

除此之外,如果您想pip在整个过程中使用并保存requests==2.3.0而不删除和重新安装,您可以指定一个constraints文件。这可以通过以下方式完成:

pip install -c constraints.txt wikipedia==1.3
Run Code Online (Sandbox Code Playgroud)

其中constraints.txt 包含以下内容:

requests>=2.3.0
beautifulsoup4
Run Code Online (Sandbox Code Playgroud)

这将产生警告,但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
Run Code Online (Sandbox Code Playgroud)

现在,如果您真的知道自己在做什么(或者只是想尝试一下它是否有效),您可以使用该--no-deps标志,该标志将完全忽略包依赖项并且不会产生上述警告:

pip install --no-deps -c constraints.txt wikipedia==1.3
Run Code Online (Sandbox Code Playgroud)

在这两种情况下都pip freeze显示:

beautifulsoup4==4.6.0
bs4==0.0.1
requests==2.3.0
wikipedia==1.3.0
Run Code Online (Sandbox Code Playgroud)

注意:这是用 pip 10.0.1 测试的,但它应该适用于任何最新的 pip 版本。