在Python中尊重命名空间的相对导入
我有这样的文件夹结构:
package/
__init__.py
misc/
__init__.py
tools.py
subpackage/
__init__.py
submodule.py
我现在在 submodule.py
文件里,我想导入 misc.tools
。我不想用绝对导入的方式去导入 package.misc.tools
,因为那样的话我的包只能在 PYTHONPATH 里才能工作。所以我想用相对导入的方式。但我还希望导入后的名字是 misc.tools
,而不仅仅是 tools
。
这样做可以吗?
1 个回答
7
那么,关于这个...:
from .. import misc
from ..misc import tools as _
print misc.tools.__file__
这段代码让 misc.tools
可以使用,正如 print
所确认的那样,而且名字和内容都是正确的。
不可避免的是,它也把同一个模块绑定到了一个简单的名字上——我选择了 _
作为一个典型的“临时名字”,当然,如果你愿意,可以在那之后用 del _
把它删除,这样不会影响到 misc.tools
。
另外,在 misc
的 __init__.py
文件中设置的任何其他属性(或者在 tools.py
中特别设置的)也会可用,但如果 misc
这个名字本身是可用的(因为如果需要复合名字 misc.tools
,它必须可用),那么它必然会拥有自己构建的所有属性(或者是从其他执行的代码中为它构建的属性)。