如何从正在从同一包导入另一个文件的包中导入文件

时间:2017-12-03 17:03:39

标签: python python-3.6

我一直致力于一个项目,我有一个文件需要从子包/目录中的文件调用一个函数,而该子文件/目录又从同一个子包中的另一个文件调用一个函数。因此,我有一个导入子文件的主文件。此子文件还导入同一包中的另一个子文件。

第一个子文件没有任何问题导入第二个子文件。主文件也没有导入第一个子文件的问题。但是,当我把它们放在一起并运行主文件时,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从根本上不支持的事情。如果有人能给我一个解决方案,那将非常感激。

我怀疑这可能是重复但我无法找到我的具体问题的答案。所以,提前抱歉。

2 个答案:

答案 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