多级相对导入
Posted
技术标签:
【中文标题】多级相对导入【英文标题】:Multilevel relative import 【发布时间】:2012-03-05 20:08:48 【问题描述】:我有以下文件夹结构
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
这样的怎么做?
【问题讨论】:
为什么是相对导入?绝对导入应该是最简单的方法;):from util.utiltest import *
【参考方案1】:
我意识到这是一个老问题,但我觉得接受的答案可能错过了提问者代码的主要问题。严格来说,这并没有错,但它给出的建议只是巧合地解决了真正的问题。
真正的问题是top\foo\bar
中的foobar.py
文件作为脚本运行。当尝试(正确!)相对导入时,它会失败,因为 Python 解释器不理解包结构。
解决此问题的最佳方法是不按文件名运行foobar.py
,而是使用-m
标志来告诉解释器运行top.foo.bar.foobar
模块。这样 Python 就会知道它正在加载的主模块在一个包中,并且它会准确地知道相对导入所指的位置。
【讨论】:
【参考方案2】:您必须从top
的父文件夹导入foobar
:
import top.foo.bar.foobar
这告诉 Python top
是***包。相对导入只能在包内进行。
【讨论】:
以上是关于多级相对导入的主要内容,如果未能解决你的问题,请参考以下文章