Python 包:相对导入

Posted

技术标签:

【中文标题】Python 包:相对导入【英文标题】:Python packages: relative imports 【发布时间】:2012-04-20 23:41:58 【问题描述】:

我正在开发一个 Python 应用程序,该应用程序由一个核心和多个使用该核心的独立模块组成。我在设置包的相对导入时遇到了困难。

app
  |- __init__.py
  |- core
        |- __init__.py
        |- corefile.py

  |- module1
        |- __init__.py
        |- main.py

__init__.py 文件为空。我正在运行 Python 2.7.1。

main.py
from .core import *

运行python main.py 会产生ValueError: Attempted relative import in non-package

类似问题:Ultimate answer to relative python imports、How to do relative imports in Python?、Relative imports in Python

感谢您的帮助。

【问题讨论】:

【参考方案1】:

简而言之,您只能从本身已导入的包中使用相对导入。

例如,如果您有:

$ cat run.py
from app.module1 import main
main.main()
$ python run.py

然后您可以在app/module1/main.py 中使用相对导入(尽管它必须是from ..core import foo,因为core/main.py 高一级)。

【讨论】:

取得了一些进展,但现在我收到了ValueError: Attempted relative import beyond toplevel package。打印__name__ 产生module.main 而不是app.module.main。为什么它看不到它上面的目录作为包的一部分? 您是如何导入的?你是从app 里面的东西导入它为module.main 吗? 我设法提出了一个稍微俗气的解决方案,其中涉及尝试不同的路径。我还按照您的建议从顶层调用module.main,所以我会继续关闭它。【参考方案2】:
import sys
abs_filepath = '/home/n/Documents/IMPORTANT/deep_learning/drori_2018/    final_proj/Ryans_branch/StackGAN/'
# insert your absolute filepath above as abs_filepath = '/path/to/targ/dir'
sys.path.append(abs_filepath)

如果以这种方式执行import 有问题,请更正

其他答案:

另请参阅here 以获得有关正在发生的事情的全面答案。

【讨论】:

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

尝试相对导入超出***包 python

PYTHON-DAY18-包 相对 绝对导入

python相对包导入报“Attempted relative import in non-package”错误

尝试使用 boost/Python 相对导入超出***包

python的相对路径导入问题

Python包的相对导入时出现问题解决