我一直在从事一个涉及多个文件的项目,并且在导入方面遇到了一些问题。我读过大约 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将正在执行的脚本所在的目录视为顶级目录,例如在folder_b目录中执行b.py时,/folder_b将被视为顶级目录,而不是/package。 为了解决您的情况,您可以使用相对导入。以下是如何调整 a.py 和 c.py 中的导入:
文件 a.py -> 从 .folder_a.b 导入你好
文件 c.py -> 从 ..folder_a.b 导入你好
这使得 Python 能够正确解析模块路径,无论当前工作目录或正在执行的脚本的位置如何。