【问题标题】:import error with python-mysql-connector 1.16, django 1.6, and python 3.2.3python-mysql-connector 1.16、django 1.6 和 python 3.2.3 的导入错误
【发布时间】:2014-04-28 02:47:51
【问题描述】:

我在 Ubuntu 主机上通过the source 新安装的 python-mysql-connector 1.1.6 在 Python 3.2.3 的 virtualenv 中在 Django 1.6 上运行 django-rest-framework。

当我运行 syncdb 并启动它时一切正常,但是当我到达任何不是根的 url 时,我从 python-mysql-connector 收到这个导入错误:

Exception Value:    

cannot import name zip_longest

Exception Location:     /usr/local/dev/python3.2.3/lib/python3.2/site-packages/mysql/connector/django/compiler.py in <module>, line 6

这是有问题的行:

from django.utils.six.moves import zip_longest

如果我激活我的 virtualenv python 二进制文件,我可以成功运行该导入语句。那么是什么给了?

>>>>from django.utils.six.moves import zip_longest
>>>>

这是我的 virtualenv 的 pip 列表输出,我计划在其中运行 Django 以验证我是否安装了所有正确的位:

(python3.2.3)thegooch@yrmomsapt:~/$ pip list
Django (1.6.2)
djangorestframework (2.3.13)
Markdown (2.4)
mysql-connector-python (1.1.6)
pip (1.5.4)
setuptools (2.2)
wsgiref (0.1.2)

【问题讨论】:

  • 很抱歉不得不询问它是否已插入,但您确实将 python-mysql-connector 安装到了您的 virtualenv 中,对吧? :)
  • 好问题,我将更新我的问题以反映它实际上已安装在我的 virtualenv 中。
  • 会不会是什么东西导致了循环导入?
  • 我不确定你的意思。您可以每天一整天都导入,除非您导入无效模块,否则不会抛出异常。我不认为它是循环的,因为 compiler.py 文件的第 6 行显然是在做出该声明,但是当您单独调用该导入时,它可以正常工作。
  • 如果我在包目录中创建两个文件,a.pyb.py,这样每个文件都只显示from a import f; def f(): pass(或from b...,无论我们不在其中),然后尝试运行它们,它给了我ImportError: cannot import name f

标签: python mysql django python-3.x


【解决方案1】:

在研究了代码后,在引用该导入时似乎出现了某种错误。我查看了 /lib/python3.2/site-packages/django/utils/six.py 文件并找到了对 move.zip_longest 模块的引用。

首先是这个参考:

moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")

这意味着它正在调用 _MovedItems 类,这里是对我的模块的引用被破坏了。

class _MovedItems(_LazyModule):
    """Lazy loading of moved objects"""

    _moved_attributes = [
        MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest")

class MovedAttribute(_LazyDescr):

    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
        super(MovedAttribute, self).__init__(name)
        if PY3:
            if new_mod is None:
            new_mod = name
            self.mod = new_mod
            if new_attr is None:
                if old_attr is None:
                    new_attr = name
                else:
                    new_attr = old_attr
            self.attr = new_attr

然后继承自 _LazyDescr 类,但这是一个简短的小对象。我不知道哪里出了问题,如果您将传递给 MovedAttribute 构造函数的元组映射,它会将旧版本正确映射到新版本。我不确定它为什么会失败,但是如果您删除 compiler.py 文件中的 import 语句并直接调用 itertools zip_longest ,一切正常。

这就是它的样子。如果您使用的是 Python 3,请编辑 /lib/python3.2/site-packages/mysql/connector/django/compiler.py 文件,并将第 6 行更改为:

from django.utils.six.moves import zip_longest as six_zip_longest

到这里:

from itertools import zip_longest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 2016-03-14
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多