在Python中尊重命名空间的相对导入

4 投票
1 回答
1327 浏览
提问于 2025-04-15 15:38

我有这样的文件夹结构:

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,它必须可用),那么它必然会拥有自己构建的所有属性(或者是从其他执行的代码中为它构建的属性)。

撰写回答