首页 > 解决方案 > eve 包的 pip install 安装了 bson 和 pymongo,这会破坏 pymongo

问题描述

我有一个使用 python eve 的项目,但最近我遇到了一个令人恼火的 pip 依赖问题。

我使用 requirements.txt 文件将依赖项安装在 docker 容器中

但是安装Eve软件包会pymongo作为依赖项安装。pymongo依赖于一个bson模块,但依赖于pypibson模块。但是,pip 安装 pypibson模块,它不适用于 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?

标签: pythonpippymongo

解决方案


卸载 bson 和 pymongo。使用 将原始 bson 安装为“pybson” pip install pybson,然后您可以同时拥有两者。我已经从 (py)bson 项目中询问了这个名称更改,请参阅https://github.com/py-bson/bson/issues/70。这与@phd 建议向pymongo 提出的要求或多或少是偶然的。(py)bson 项目成员“在一分钟内”完成了这项工作。

我知道你必须在之后安装 pymongo 才能import pybson工作,请参阅为什么我必须在 pybson (=bson, GitHub:py-bson) 之后安装 pymongo 才能成功导入 pybson?. 安装 bson 时使用原版pip install bson而不是 .相同的帐户pip install pybson,那么您必须保持顺序:1. bson,2. pymongo,请参阅Can't connect to MongoDB 2.0.5 database with pymongo 2.2

我还没有测试过,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技巧时,安装顺序不再重要。


推荐阅读