Python:导入一个导入模块的模块

6

在文件foo中,我正在导入模块:

import lib.helper_functions
import lib.config

在helper_functions.py中,我有以下内容:
import config

当我运行foo的主函数时,会出现ImportError错误。
编辑:下面是我拥有的文件结构。
foo.py
lib/
    config.py
    helper_functions.py

导致错误的原因是在 helper_functions 中导入了 config。
Traceback (most recent call last):
  File "C:\Python33\foo.py", line 1, in <module>
    import lib.helper_functions
  File "C:\Python33\lib\helper_functions.py", line 1, in <module>
    import config
ImportError: No module named 'config'

所以说:当我运行foo.py时,解释器会抱怨helper_functions的导入语句。但是当我运行helper_functions的主函数时,却没有出现任何错误。

3
每个使用模块的文件都需要导入它们;每个模块都有自己的命名空间,不会继承导入文件中的名称(除非您使用“from foo import *”语法,但应避免使用此语法,因为它会导致可怕且难以诊断的错误)。 - Wooble
如果你说我需要在foo中导入config,那我已经这样做了(当然,在foo中我必须将其称为lib.config)。这并没有解决NameError的问题。 - Anas Elghafari
2
我在你的回溯中没有看到NameError,我看到了一个ImportError,那是一个非常不同的错误。 - Martijn Pieters
谢谢您的留言,我在最近的编辑之前实际上已经最小化地重新创建了原始设置。因此,我的代码中确实存在NameError,但那是来自其他地方的。我想我应该进行编辑,因为它不是这个特定问题的一部分。 - Anas Elghafari
2个回答

7
您需要使用绝对导入来导入 config。可以使用以下方式:
from lib import config

或使用:

from . import config

Python 3 只支持绝对导入; 语句 import config 只会导入顶层模块 config


@AnasElghafari:啊,抱歉,我没有仔细阅读你的问题。如果一开始就加上了回溯信息,那就更清楚了。 - Martijn Pieters
@AnasElghafari:在更新的答案中解决了你实际的问题。 - Martijn Pieters
@Marijn:好的,谢谢。我在helper_functions中更改了导入语句,使其变为:from lib import config。这样就解决了问题。 - Anas Elghafari
相同的错误:ImportError: No module named libValueError: Attempted relative import in non-package - Luis A. Florit
你只能在包内部使用相对导入(即路径上带有 __init__.py 的目录),不能在顶层模块之间使用。 - Martijn Pieters
显示剩余2条评论

0
在Python中,每个模块都有自己的命名空间。当你导入另一个模块时,实际上只是导入它的名称。
因为你在helper_functions模块中导入了它,所以名称“config”存在于该模块中。在foo中导入helper_functions仅将名称“helper_function”带入foo的命名空间中,没有其他内容。
实际上,通过当前的导入方式,你可以在foo.py中引用“config”名称,例如:
lib.helper_functions.config

但是在Python中,明示比隐式更好。因此,在foo.py中导入config将是最佳选择。

#file foo.py
import lib.helper_functions
import config

好的,配置文件在lib目录下。我已经在foo.py中导入它(import lib.config)。但是当运行foo.main时,解释器会抱怨helper_functions.py中的导入语句。虽然当我运行helper_functions.main时,没有出现这样的错误。无论如何,我编辑了问题以添加错误信息。 - Anas Elghafari
啊,我现在看到你的编辑了。我无法重现它,因为我使用的是Python2.7。这只会在Python3中出现错误。原因已经在@Martijn Pieters的答案中解释过了。 - jujaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接