2011-04-26 58 views
5
包导入困境

我的结构是这样的:在Python

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失败了。

回答

5

有一个在projectpackage/__init__.py不需要绝对的进口,做一个相对

import somemodule as module_shortname 

你这样做(绝​​对进口)的方式,将导致循环进口,不很好地工作在Python中。当您导入模块时,您还要调用父模块的__init__.py。在你的情况下,绝对导入你也在projectpackage/__init__.py呼吁projectpackage/__init__.py

+0

诊断(即循环导入问题)是正确的,但解释和建议的解决方案并不完全正确。当执行'projectpackage/__ init __。py'时,'companynamespace'中的'projectpackage'属性尚未设置,因此会引发特定的错误。对于当前的Python,显式相对导入('from。import somemodule')是比依赖隐式相对导入更好的选择。 – ncoghlan 2011-04-27 05:26:26

+0

血淋淋的细节可以在http://bugs.python.org/issue992389 – ncoghlan 2011-04-27 05:28:25

+0

感谢mil,我想到了一个循环导入问题,但不知道Python必须解决它的功能。 – 2011-04-29 00:25:33

1

那么,根据PEP 221你的代码似乎是合法的。这可能是一个错误。下面的解决方法,这相当于该表达的,对我的作品(Python的2.6.6):

from companynamespace.projectpackage import somemodule as module_shortname 

希望它能帮助。