python导入树中的顶级模块在哪里?怎么定义呢?

问题描述 投票:0回答:1

我一直在从事一个涉及多个文件的项目,并且在导入方面遇到了一些问题。我读过大约 20 篇文章和堆栈溢出问题,但似乎没有一篇能解释这种行为。

如果我有一个如下所示的文件夹系统:

\package
    \folder_a
        __init__.py
        b.py
    __init__.py
    a.py

hello
中有一个简单的
b.py
函数。在
a.py
我有
from package.folder_a.b import hello
。当我运行
a.py
时,出现错误“ModuleNotFoundError:没有名为“package”的模块”。

为什么会出现这种情况?当

a.py
运行时,
package
不是顶级目录吗?

现在,我通过简单地将

a.py
中的代码更改为
from folder_a.b import hello
找到了解决方案,但这又带来了另一组问题。假设我正在使用稍微复杂的文件结构(我是女巫),例如:

\package
    \folder_a
        __init__.py
        b.py
    \folder_b
        __init__.py
        c.py
    __init__.py
    a.py

这里我想将

hello
导入到
c.py
中。
from package.folder_a.b import hello
from folder_a.b import hello
都会导致相同的“ModuleNotFoundError:没有名为“package/folder_a(repectivly)”的模块”。我认为这是因为该文件在执行时没有将这些文件夹添加到命名空间(在运行 a.py 时将 c 导入到 a 中允许导入工作)。有没有办法强制
\package
成为顶级模块,而不涉及从其自己目录中的文件运行脚本?我希望这是有道理的。谢谢。

python python-import
1个回答
1
投票

Python将正在执行的脚本所在的目录视为顶级目录,例如在folder_b目录中执行b.py时,/folder_b将被视为顶级目录,而不是/package。 为了解决您的情况,您可以使用相对导入。以下是如何调整 a.py 和 c.py 中的导入:

文件 a.py -> 从 .folder_a.b 导入你好

文件 c.py -> 从 ..folder_a.b 导入你好

这使得 Python 能够正确解析模块路径,无论当前工作目录或正在执行的脚本的位置如何。

© www.soinside.com 2019 - 2024. All rights reserved.