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

Python包中__init__.py与__main__.py执行异常问题求助

Python包导入与-m运行时的双重执行问题及解决办法

问题根源

你之前的认知存在偏差:Python包机制下,用-m运行包时,会先完整导入整个包(执行__init__.py的所有代码),再去执行__main__.py,所以两种场景下两个文件都会被执行是正常行为。但RuntimeWarning的出现,是因为__init__.py的代码间接导入了__main__模块,导致sys.modules在Python准备执行__main__.py之前,就已经存在package.__main__的条目,打破了Python的执行预期。

你用del sys.modules['package.__main__']只是临时清除了模块缓存,属于治标不治本,甚至可能引发模块重复导入、状态不一致等问题。

正确解决方案

1. 严格分离导入逻辑与命令行逻辑

  • __init__.py仅负责包的导入逻辑:导出公共API、初始化基础组件,但绝对不要引入__main__模块或执行命令行相关代码。
  • __main__.py作为独立的命令行入口,仅处理命令行参数、启动流程,需要包内组件时直接导入,避免与__init__.py产生不必要的依赖。

2. 检查依赖注入容器的初始化

确保container_module.py的代码没有间接导入__main__模块。如果容器需要在两种场景(导入包、命令行运行)下都可用,将容器初始化逻辑完全封装在utility/container_module.py中,再让__init__.py和__main__.py分别按需导入这个模块。

3. 示例代码

__init__.py 写法

# 仅导出公共API,不执行命令行逻辑
from package.readers.reader_module import Reader
from package.writers.writer_module import Writer
from package.utility.container_module import container

__all__ = ["Reader", "Writer", "container"]

__main__.py 写法

import sys
from package.utility.container_module import container
from package.readers.reader_module import Reader
from package.writers.writer_module import Writer

def main():
    # 从容器获取实例
    reader = container.reader()
    writer = container.writer()
    # 执行命令行业务逻辑
    data = reader.read()
    writer.write(data)
    sys.exit(0)

if __name__ == "__main__":
    main()

4. 验证与排查

如果警告仍然存在,检查以下几点:

  • 所有模块中是否有import package.__main__的语句,尤其是容器模块或__init__.py
  • 确保container_module.py的初始化代码不会触发__main__模块的导入
  • 运行时通过print(sys.modules.keys())查看package.__main__是否在__init__.py执行时就已被加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:05:11