我一直致力于一个项目,我有一个文件需要从子包/目录中的文件调用一个函数,而该子文件/目录又从同一个子包中的另一个文件调用一个函数。因此,我有一个导入子文件的主文件。此子文件还导入同一包中的另一个子文件。
第一个子文件没有任何问题导入第二个子文件。主文件也没有导入第一个子文件的问题。但是,当我把它们放在一起并运行主文件时,Python认为第二个子文件不存在,我觉得很奇怪。我通过以下示例简化并可视化了我的问题:
我有以下文件层次结构:
test_package\
__init__.py
main_file.py
test_sub_package\
__init__.py
subfile1.py
subfile2.py
main_file代码:
import test_sub_package.subfile1
subfile1代码:
import subfile2
subfile2代码:
def get_string():
return ("Hello, World!")
所以,我希望main_file通过subfile1导入subfile2。然而,这似乎并非如此,因为我收到了错误:
Traceback (most recent call last):
File "...\Test\main_file.py", line 1, in <module>
import test_package.subfile1
File "...\Test\test_sub_package\subfile1.py", line 1, in <module>
import subfile2
ModuleNotFoundError: No module named 'subfile2'
在我尝试调用subfile2中的功能之前,我有点意外,我有点意外。无论哪种方式,我都很困惑为什么这不起作用。我只是在做一些愚蠢的事情,或者我正在尝试做一些Python从根本上不支持的事情。如果有人能给我一个解决方案,那将非常感激。
我怀疑这可能是重复但我无法找到我的具体问题的答案。所以,提前抱歉。
答案 0 :(得分:2)
当您将模块从同一目录导入另一个模块时,您必须使用必须在subfile1.py中使用相对导入,您需要编写:
from . import subfile2
注意,这并不能让子文件1访问get_string
以在子文件1中使用它,您需要编写subfile2.get_string()
或直接导入它:
from .subfile2 import get_string
我试过这个并且它有效,我希望这有帮助:)
注意:如果您正在运行python脚本,并且需要在同一目录中导入模块,则可以说import module_name
。如果它是您正在运行的脚本,或者是在其他脚本中使用的模块,则会有所不同。有关为何查看here
(我从您的错误消息中假设您要运行main.py,如果不是这种情况,您需要将import test_sub_package.subfile1
更改为from . import test_sub_package.subfile1
)
答案 1 :(得分:1)
主文件应该是:
from test_sub_package.subfile1 import get_string
get_string()
subfile1.py
import test_sub_package.subfile2