【问题标题】:Can't import namespace package "c4d" but any other name for it works无法导入命名空间包“c4d”,但它的任何其他名称都有效
【发布时间】:2015-11-10 11:17:41
【问题描述】:

我已经为自己构建了一个 Python 库集合,我在 nr 命名空间下收集这些库。现在对于名为 C4D 的应用程序中的 Python 插件,我想使用 nr.c4d 模块,但无法导入。奇怪的是,如果我将其重命名为其他任何名称(例如 nr.c4dlib),它就可以工作!

+ nr.c4d\
  + nr\
    * __init__.py  # < pkgutil.extend_path() in here
    + c4d\
      * __init__.py
      * gui.py
      * ...

这是每个命名空间__init__.py中的代码

# This is a namespace package.
try:
  import pkg_resources
  pkg_resources.declare_namespace(__name__)
except ImportError:
  import pkgutil
  __path__ = pkgutil.extend_path(__path__, __name__)

nr.__path__ 列表似乎也不错。

['C:\\maxon\\Cinema 4D R16 Dev\\plugins\\procedural\\python\\nr',
 'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.strex\\nr',
 'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.concurrency\\nr',
 'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.cli\\nr',
 'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.c4d\\nr']

但我明白了

Traceback (most recent call last):
  File "'cloudui_frontend.pyp'", line 176, in <module>
ImportError: No module named c4d

环境中可能有一个名为c4d 的内置模块。这个错误的根源是什么?如何解决?


更新问题似乎来自另一个名为nr.procedural 的命名空间模块。它在文件顶部执行import c4d。如果该行被注释掉,则导入 nr.c4d 有效!另外,我可以添加from __future__ import absolute_import,而不是注释掉该行。

【问题讨论】:

    标签: python import namespaces python-2.6


    【解决方案1】:

    在第二次扩展nr.__path__ 之前,相对导入导致在sys.modules 中为nr.c4d 创建一个None 条目。这是我在localimport 存储库中打开的问题:

    场景nr.procedural 执行import c4d。如果nr.c4d 不存在,该模块将作为无条目添加到sys.modules。如果然后使用_localimport 导入nr.c4d,则将找不到该模块,因为模块缓存表明该模块不存在(通过None-entry)。

    解决方案_localimport 必须删除 __enter__() 上命名空间包的无条目。

    fix 比较简单。

    不过,我需要将from __future__ import absolute_import 添加到所有nr. 子包中import c4d

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多