【问题标题】:Python: A problem with the package import from ... import * using __all__ and __init__Python:使用 __all__ 和 __init__ 从 ... import * 导入包的问题
【发布时间】:2021-08-03 19:11:37
【问题描述】:

我有以下带有 2 个模块的 Python 包:

-pack1 
|-__init__ 
|-mod1.py 
|-mod2.py
-import_test.py

用代码:

# in mod1.py
a = 1

# in mod2.py
from mod1 import a
b = 2

__init__ 代码:

# in __init__.py
__all__ = ['mod1', 'mod2']

接下来,我正在尝试导入包:

# in import_test.py
from pack1 import *

但我得到一个错误:

ModuleNotFoundError: 没有名为“mod1”的模块

如果我在 mod2.py 中删除“从 mod1 导入 a”的依赖项,导入会正确进行。但是这种依赖使导入不正确,出现异常“ModuleNotFoundError”。

???

【问题讨论】:

    标签: python import package


    【解决方案1】:

    这里的问题是,从mod2 的角度来看,它将在其中搜索模块的第一级位于您从中导入它的路径中(这里我假设 pack1 不在您的 PYTHONPATH 中并且您在从包含pack1 的同一目录中导入它)。

    这意味着如果pack1 在目录/dir/to/pack1 中并且您这样做:

    from mod1 import a
    

    Python 将在与pack1 相同的目录中查找mod1,即/dir/to/pack1

    要解决您的问题,只需执行以下任一操作即可:

    from pack1.mod1 import a
    

    或在 Python 3.5+ 中

    from .mod1 import a
    

    附带说明,除非您必须这样做,否则我不建议将您的包设计为from pack import *,即使存在__all__ 可以让您更好地控制公共 API。

    【讨论】:

    • 此解决方案“从 pack1.mod1 导入 a”有效。我想我已经明白出了什么问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多