2012-02-14 51 views
16

多层次的相对进口多级相对进口

我有以下文件夹结构

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

如何做这样的multileve相对进口?

+1

为什么相对导入?绝对导入应该是这样做的最简单的方法;):'from util.utiltest import *' – 2012-02-14 12:56:53

回答

12

必须从top父文件夹导入foobar

import top.foo.bar.foobar 

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

11

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

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

这样做的最好的解决办法是通过文件名来运行foobar.py没有,而是使用-m标志来解释,告诉它运行top.foo.bar.foobar模块。通过这种方式,Python将知道它所加载的主要模块位于一个包中,并且它将确切知道相对导入所指的位置。