You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求示例解释Python中__init__.py阻止同名目录隐藏模块的机制

示例解释:init.py如何防止同名目录隐藏系统模块

背景

Python导入模块时,会按sys.path里的路径顺序查找,当前工作目录通常排在系统模块目录的前面。


场景1:没有__init__.py的同名目录

假设你不小心在项目根目录创建了一个名为string的空目录:

my_project/
└── string/  # 空目录,无__init__.py

当你在项目根目录运行Python并执行import string:

  1. Python先找到当前目录下的string目录,但因为没有__init__.py,不会将其视为包(除非启用命名空间包特性)。
  2. 于是Python继续往后搜索,最终导入系统自带的string模块。
  3. 此时你能正常使用系统string的功能:
    import string
    print(string.ascii_uppercase)  # 输出: ABCDEFGHIJKLMNOPQRSTUVWXYZ
    

场景2:存在__init__.py的同名目录

如果给这个string目录添加一个空的__init__.py文件:

my_project/
└── string/
    └── __init__.py  # 空文件

当你执行import string时:

  1. Python识别到带有__init__.py的string目录,将其视为常规包并导入。
  2. 此时导入的是你自定义的string包,而非系统的string模块。
  3. 尝试调用系统string的功能会报错:
    import string
    print(string.ascii_uppercase)  # 报错: AttributeError: module 'string' has no attribute 'ascii_uppercase'
    

核心逻辑

init.py的存在是明确告知Python“这个目录是我刻意创建的包”。如果没有这个文件,Python会忽略同名目录,继续搜索后续的有效模块,避免了因误创建同名目录而导致系统模块被意外隐藏的问题。

内容的提问来源于stack exchange,提问作者IcyBrk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:29:59