【问题标题】:Package Import woes in PythonPython 中的包导入问题
【发布时间】:2011-04-26 21:22:00
【问题描述】:

我的结构是这样的:

companynamespace/
  __init__.py
  projectpackage/
    __init__.py
    somemodule.py

companynamespace/__init__.py 为空

projectpackage/__init__.py 有这一行:

import companynamespace.projectpackage.somemodule as module_shortname

当我打开 python 控制台并输入 import companynamespace.projectpackage(为此正确设置了 PYTHONPATH)时,我在 import companynamespace.projectpackage.somemodule as module_shortname 行上得到了 AttributeError: 'module' object has no attribute 'projectpackage'。如果我删除 as module_shortname 部分(并在文件的其余部分进行所有必要的替换),则所有内容都会正确导入。

谁能告诉我这是为什么?我的 Google-Fu 让我失望了。

【问题讨论】:

    标签: python import package


    【解决方案1】:

    projectpackage/__init__.py中不需要绝对导入,做相对一个

    import somemodule as module_shortname
    

    您执行此操作的方式(使用绝对导入)会导致循环导入,这在 Python 中效果不佳。当您导入模块时,您还调用了父模块的__init__.py。在您的情况下,通过绝对导入,您还可以在 projectpackage/__init__.py 中调用 projectpackage/__init__.py

    【讨论】:

    • 诊断(即循环导入问题)是正确的,但解释和建议的解决方案并不完全正确。执行projectpackage/__init__.py 时,companynamespace 中的projectpackage 属性尚未设置,因此会引发特定错误。对于当前的 Python,显式相对导入 (from . import somemodule) 比依赖隐式相对导入更好。
    • 谢谢,我想出了一个循环导入问题,但不知道 Python 必须解决什么功能。
    【解决方案2】:

    好吧,根据PEP 221,您的代码似乎是合法的。这可能是一个错误。以下与该表达式等效的解决方法适用于我(Python 2.6.6):

    from companynamespace.projectpackage import somemodule as module_shortname
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 2021-04-05
      • 2019-10-03
      • 2015-01-27
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多