多级相对导入

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 是***包。相对导入只能在包内进行。

【讨论】:

以上是关于多级相对导入的主要内容,如果未能解决你的问题,请参考以下文章

绝对导入和相对导入

Python 包内的导入问题(绝对导入和相对导入)

详解Python中的相对导入和绝对导入

相对导入

Python中的相对导入语法

模块导入循环导入模块查找顺序相对导入及绝对导入