我有一个基于python flask
的应用程序,它写入mongo数据库。
我正在使用python 3
以及requirements.txt
Flask
Jinja2
Werkzeug
certifi
chardet
gunicorn
requests
flask_restful
flask
pymongo
我遇到了这个问题:
Traceback (most recent call last):
File "bin/app.py", line 4, in <module>
from helper import save_message_2_db
File "/app/bin/helper.py", line 1, in <module>
from database import DataAccess, MongoDB
File "/app/bin/database.py", line 1, in <module>
import pymongo
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 83, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 21, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 19, in <module>
from bson.py3compat import string_type, PY3, text_type
ModuleNotFoundError: No module named 'bson.py3compat'
我想知道为什么会这样?
本节是我关注的内容
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 83, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 21, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 19, in <module>
from bson.py3compat import string_type, PY3, text_type
ModuleNotFoundError: No module named 'bson.py3compat'
大多数互联网博客/链接告诉我bson
和pymongo
不能互相配合。 pymongo
拥有自己的bson
版本,我在requirements.txt
中不需要它。
我正在寻求帮助,看看为什么会发生这种情况,以及如何重新解决这个问题。
更新#1
我正在使用pymongo-3.5.1
,这就是问题仍然存在的地方。我只是降级到pymongo-3.5.0
,问题就消失了。
这意味着我知道解决此问题的解决方法,但上游代码/包有一些需要修复的问题。
答案 0 :(得分:5)
尝试同时卸载bson
和pymongo
:
sudo pip uninstall bson
sudo pip uninstall pymongo
然后使用pip 重新安装pymongo
:
sudo pip install pymongo
答案 1 :(得分:1)
可能是某些程序包配置错误。如果bson包来自
mongo-python-driver很可能,因为在第19行中,导入语句from bson.py3compat import string_type, PY3, text_type
存在。
但是文件py3compat.py
似乎丢失了,它应该在code.py
路径的bson
旁边。
<强>更新强>
在问题更新后,让我们知道降级修复了问题并检查了两个版本之间的code changes,无法识别问题的相关更改。因此,它更能说明这些模块有问题,究竟是什么难以分辨。
答案 2 :(得分:1)
@bauman.space在this线程中提供了有关此bson / pymongo导入问题的最多信息和有用解释:
pymongo> = 2.7.1指令会覆盖您的bson安装
来自https://github.com/mongodb/mongo-python-driver
请勿从pypi安装“ bson”软件包。 PyMongo带有自己的bson软件包。
easy_install bson
或pip install bson
会安装与PyMongo不兼容的第三方程序包。假设您确实要使用第三方bson,则需要
pip卸载bson(删除通过pymongo软件包降落的覆盖的bson) pip install bson(重新安装py-bson软件包) 或者,您可以修补pymongo安装程序以删除collections.abc行(显然您不是真的需要它吗?),但是将生产打包代码弄乱是有问题的。
pymongo模块https://github.com/mongodb/mongo-python-driver/blob/master/bson/py3compat.py#L22-L25
您尝试使用的py-bson模块。 https://github.com/py-bson/bson/blob/master/bson/py3compat.py#L22-L24
答案 3 :(得分:1)
该解决方案已经被接受,但是我还是想写。我遇到了同样的问题,当我先安装bson和pymongo时,问题解决了,顺序很重要。