【问题标题】:pymongo import errors in python3 flask applicationpython3烧瓶应用程序中的pymongo导入错误
【发布时间】:2020-06-26 22:40:46
【问题描述】:

我有一个基于 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'

大多数互联网博客/链接告诉我bsonpymongo 不能很好地相互配合。 pymongo 有自己的bson 版本,我的requirements.txt 不需要它。

我正在寻求帮助,看看为什么会发生这种情况,以及如何解决这个问题。


更新 #1

我使用的是pymongo-3.5.1,这就是问题仍然存在的地方。我刚刚降级到pymongo-3.5.0,问题就消失了。

这意味着我知道解决此问题的解决方法,但上游代码/包有一些需要修复的问题。

【问题讨论】:

  • 我相信上述错误与我的python versionrequirements.txt有关
  • 您是否再次尝试升级?这两个版本之间的 comparison 不会显示与您的问题相关的更改。
  • @c11o - 这太疯狂了,我想我在 heroku 部署过程中遇到了某种问题。现在我搬到了最新的,我没有看到这个问题。
  • 还是让我抓狂,为什么会这样? heroku 上的 buildpack 会破坏 virtualenv 并每次都将其复活。

标签: python mongodb python-3.x pymongo pymongo-3.x


【解决方案1】:

尝试同时卸载bsonpymongo

sudo pip uninstall bson
sudo pip uninstall pymongo

然后重新安装pymongo使用pip

sudo pip install pymongo

【讨论】:

  • 是的 - 已经尝试过了,这就是我在我的问题中发布它并提供我的需求文件的原因。
  • 我不确定 - 为什么这一步不起作用,我尝试的是这样的。看起来这可能是 heroku 的 isuee
  • 在我的情况下,我必须使用 sudo pip uninstall 卸载,然后使用 sudo uninstall 清理所有内容,然后它就可以工作了 :-)
【解决方案2】:

卸载bsonpymongo。然后,先安装bson,再安装pymongo

【讨论】:

    【解决方案3】:

    可能是一些包配置错误。如果 bson 包来自 mongo-python-driver,这很可能,因为在第 19 行,导入语句 from bson.py3compat import string_type, PY3, text_type 存在。

    但是文件py3compat.py 似乎丢失了,它应该在bson 路径中的code.py 旁边。

    更新

    在问题的更新让我们知道降级解决了问题并检查了两个版本之间的code changes 之后,没有发现对该问题的相关更改。因此,它更表明模块有问题,具体是什么很难说。

    【讨论】:

    • 这似乎是迄今为止最接近的答案,但我为什么要打这个仍然是个谜。
    • 我正在更新我的发现 - 与你的答案方向。
    • 你能更新你的答案吗,-我可以选择它作为找到调试此问题的步骤的正确方法。
    【解决方案4】:

    @bauman.spacethis 线程中提供了关于此 bson/pymongo 导入问题的最信息性有用解释:

    pymongo>=2.7.1 指令覆盖你的 bson 安装

    来自https://github.com/mongodb/mongo-python-driver

    不要从 pypi 安装“bson”包。 PyMongo 自带 bson 包;执行easy_install bsonpip install bson 会安装与PyMongo 不兼容的第三方包。

    假设你真的想使用 3rd 方 bson,你需要

    pip uninstall 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

    【讨论】:

    • 更新:要使用 pymongo bson,请通过其 collection 模块访问它。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多