18

多级相对导入

我有以下文件夹结构

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

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

4

2 回答 2

14

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

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

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

于 2015-09-16T19:48:59.093 回答
13

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

import top.foo.bar.foobar

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

于 2012-02-14T13:14:45.637 回答