多级相对导入
我有以下文件夹结构
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
如何做这样一个多级的相对导入?
发布于 2012-02-14 21:14:46
您必须从top
的父文件夹导入foobar
import top.foo.bar.foobar
这告诉Python top
是顶层的包。只有在包中才能进行相对导入。
发布于 2015-09-17 03:48:59
我意识到这是一个古老的问题,但我觉得公认的答案可能遗漏了提问者代码的主要问题。严格地说,这不是错误的,但它给出了一个建议,只是巧合地绕过了真正的问题。
真正的问题是top\foo\bar
中的foobar.py
文件是作为脚本运行的。当一个(正确!)尝试相对导入,因为Python解释器不理解包结构,所以导入失败。
解决这个问题的最好方法是不通过文件名运行foobar.py
,而是使用解释器的-m
标志来告诉它运行top.foo.bar.foobar
模块。通过这种方式,Python将知道它加载的主模块在包中,并且它将确切地知道相对导入引用的位置。
https://stackoverflow.com/questions/9277200
复制相似问题