我有一个非常简单的项目架构:
project/
__init__.py
dira/
__init__.py
a.py
dirb/
__init__.py
b.py
所有__init__.py
都是空的。
a.py
只包含一个"你好"功能:
def hello(): return "hello world"
我希望b.py使用a.py中的hello函数。
到目前为止我尝试了什么:
根据this question的答案,我尝试了:
import ..dira.a as aa
aa.hello
但是当运行b.py时,..a.a
我还尝试手动将项目目录添加到sys.path然后运行:
import dira.a as aa
aa.hello
但是当我运行b.py
时,我得到了:
ImportError:没有名为' a'
的模块
我该怎么办?为什么我找到的解决方案不起作用?
答案 0 :(得分:0)
简短回答:
import ..dira
语法无效,只有from ..dira.a import hello
有效
工作配置:b.py:
from ..dira.a import hello
print(hello())
另外,来自docs:
“请注意,相对导入基于当前的名称 模块。由于主模块的名称始终为“ main ”, 用作Python应用程序主模块的模块 必须始终使用绝对进口。“
因此,如果您进行相对导入,则无法直接调用b.py.显然,您无法从项目级别执行此操作。 (project
文件夹中的Python解释器,调用import dirb.b
)
An error occurs:
ValueError: attempted relative import beyond top-level package
但是调用import project.dirb.b会产生正确的输出:
hello world
编辑:Why import project.dirb.b can be called only outside of project module?
让我们从翻译方面看问题。
import project.dirb.b
。它运行dirb / init .py,'current module'是project.dirb ..dira.a
视为“移动一个模块并转到dira并导入a.hello”。 '当前模块'是project.dirb,因此父模块是项目,因此它找到parent.dira 因此,相对导入使project.dirb.b只能在项目之外导入。