Raz*_*zer 18 python relative-path python-packaging
多级相对导入
我有以下文件夹结构
top\
__init__.py
util\
__init__.py
utiltest.py
foo\
__init__.py
foo.py
bar\
__init__.py
foobar.py
Run Code Online (Sandbox Code Playgroud)
我想从foobar.py
模块访问utiltest.py
.我试过跟随相对导入,但这不起作用:
from ...util.utiltest import *
我总是得到
ValueError: Attempted relative import beyond toplevel package
怎么做这样的多重相对导入?
Blc*_*ght 13
我意识到这是一个老问题,但我觉得接受的答案可能会错过提问者代码的主要问题.严格来说,这并没有错,但它提出了一个建议,即只巧巧地解决了真正的问题.
真正的问题是foobar.py
文件top\foo\bar
正在作为脚本运行.当尝试(正确!)相对导入时,它会失败,因为Python解释器不理解包结构.
对此最好的解决方法是foobar.py
不是通过文件名运行,而是使用-m
解释器的标志来告诉它运行top.foo.bar.foobar
模块.这样Python就会知道它正在加载的主模块在一个包中,并且它将确切地知道相对导入所引用的位置.
Jan*_*ila 12
您必须foobar
从以下父文件夹导入top
:
import top.foo.bar.foobar
Run Code Online (Sandbox Code Playgroud)
这告诉Python这top
是顶级包.只能在包内进行相对导入.