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 包:相对导入的主要内容,如果未能解决你的问题,请参考以下文章