我有一个使用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?
答案 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 技巧时,安装顺序不再重要。