多级相对导入

时间:2012-02-14 12:52:57

标签: python import module relative

多级相对导入

我有以下文件夹结构

top\
   __init__.py
   util\
      __init__.py
      utiltest.py
   foo\
      __init__.py
      foo.py
      bar\
         __init__.py
         foobar.py

我想从foobar.py模块utiltest.py访问。我试过跟随相对导入,但这不起作用: from ...util.utiltest import *

我总是得到 ValueError: Attempted relative import beyond toplevel package

如何进行这样的多重相对导入?

2 个答案:

答案 0 :(得分:12)

您必须从foobar的父文件夹中导入top

import top.foo.bar.foobar

这告诉Python top是顶级包。只能在包内进行相对导入。

答案 1 :(得分:11)

我意识到这是一个老问题,但我觉得接受的答案可能会错过提问者代码的主要问题。严格来说,这并没有错,但它提出了一个建议,即只巧巧地解决了真正的问题。

真正的问题是foobar.py中的top\foo\bar文件正在作为脚本运行。当尝试(正确!)相对导入时,它会失败,因为Python解释器不了解包结构。

最好的解决方法是运行foobar.py而不是文件名,而是使用-m标志来解释器告诉它运行top.foo.bar.foobar模块。这样Python就会知道它加载的主模块在一个包中,并且它将确切地知道相对导入所指的位置。