eve软件包的pip安装会安装bson和pymongo,这会破坏pymongo

时间:2019-02-01 17:25:56

标签: python pip pymongo

我有一个使用python eve的项目,但最近我一直遇到pip令人发指的依赖性问题。

我使用requirements.txt文件在码头工人容器安装的依赖

无论如何,安装Eve软件包都将pymongo作为依赖。 pymongo取决于bson模块,但不是 pypi bson模块。但是,pip安装pypi bson模块将无法与pymongo一起使用,从而导致错误:

from bson.py3compat import abc, string_type, PY3, text_type
ImportError: cannot import name 'abc'

当pymongo是进口的。

我必须调整dockerfile来执行以下操作:

RUN pip3 install -r requirements.txt
RUN pip3 uninstall bson --yes
RUN pip3 uninstall pymongo --yes
RUN pip3 install pymongo --user

是否有一种方法可以在管道文件或requirements.txt中指示它不需要尝试从pypi安装bson?

2 个答案:

答案 0 :(得分:1)

pymongo并没有带来bson的依赖,它只有自己的bson实现。问题是pymongo将其bson安装为site-packages/中的顶级目录,从而覆盖了那里的任何现有bson

没有简单的方法来解决此问题。尝试联系pymongo作者并说服他们停止覆盖顶级bson。

答案 1 :(得分:1)

卸载bson和pymongo。可以使用pip install pybson将原始bson安装为“ pybson”,然后可以将它们并行安装。我已经要求从(py)bson项目中更改此名称,请参见https://github.com/py-bson/bson/issues/70。偶然地或多或少与@phd建议从pymongo询问的相反。 (py)bson项目成员“在一分钟内”完成了此操作。

我知道您必须随后安装pymongo才能使import pybson工作,请参阅Why do I have to install pymongo after pybson (=bson, GitHub:py-bson) to get pybson imported successfully?。 使用原始pip install bson而不是pip install pybson安装bson时,使用相同的帐户,那么您必须保持顺序:1. bson,2。pymongo,请参阅{{3} }。

我尚未测试pip install pybson而不是pip install bson的技巧是否与1. pybson和2. pymongo的安装顺序无关,反之亦然,但这很可能使顺序就不相关了。

另一方面,通常遵循此安装顺序(1.(py)bson和2. pymongo)也不会造成损害,所以为什么不这样做。既以pybson身份进行安装,又以正确的安装顺序均可解决此问题,所以为什么不同时使用这两种方法。

如果将bson安装为pybson,则可以选择在一个脚本中使用两个软件包的两个不同的bson模块。这就是为什么我建议:

  • 第一 pip install pybson

  • 之后 pip install pymongo

我检查了用pip install pybson安装bson软件包(不是bson!)时是否需要此确切命令。安装pymongo之后,我安装了pybson。它不会损害pymongo的安装,并且import pybson也可以正常工作。由此可见,使用 pybson 技巧时,安装顺序不再重要。