19

我目前正在处理一个包,并且在我的 中requirements.txt,我有一个依赖项:wikipedia. 现在,wikipedia1.3 使用requests-2.2.1,而我的包使用 2.3.0 版本。

此外,正如人们所期望的那样,wikipedia-1.3的安装取决于它的依赖项的存在。

但是,如果我启动一个新的 virtualenv 并直接包含wikipedia在 my 中requirements.txt,它会给出一个ImportErroron,requests因为在setup.py运行时,requests-2.3.0'ssetup.py不会执行,除非所有其他人都执行。在下图中,拆包后没有运行setup.pyrequests

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

出于某种奇怪的原因,wikipedia's setup.pycontains import wikipedia,它甚至在安装之前就导入了它的依赖项;但是它通过了 CI 测试,因为它通过 pip 单独安装需求,然后运行setup.py​​.

为了克服这种情况,我制作了一个设置脚本,其中包括:

pip install -r requirements.txt
pip install wikipedia
pip install -e .
  • 这安装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.

我尝试通过各种规范来克服这个问题,但这些都令人困惑。我怎么能克服这个烂摊子?

4

1 回答 1

6

正如 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 版本。

于 2018-06-19T07:07:29.213 回答