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

同名目录引发Python ModuleNotFoundError,求Django兼容解决方案

解决方案与设计分析

简便修复方案

利用Python命名空间包合并模块

Python 3.3+支持隐式命名空间包,可让不同路径下的同名包合并为统一命名空间,同时兼容app.bar和app.foo的导入需求。操作步骤:

  • 删除/home/michael/project/src/core/app/__init__.py和/home/michael/project/src/dist/app/__init__.py(若这两个文件存在)
  • 无需修改sys.path,Python会自动将两个路径下的app目录合并为一个命名空间,此时import app.bar和import app.foo均可正常找到对应模块。

临时应急方案(不推荐长期使用)

若不想调整文件结构,可在Django启动前手动扩展app包的搜索路径:

import app
app.__path__.append('/home/michael/project/src/core/app')

此方案需在所有导入操作前执行,且依赖硬编码路径,维护性差,仅适合临时测试场景。

设计模式问题分析

当前设计存在核心矛盾:

  1. 将core和dist直接加入sys.path顶层,导致同名app包触发Python模块搜索的“先到先得”规则,引发冲突。
  2. 需求是“将dist应用移至core后仍正常运行”,但平级路径设计无法天然支持——迁移后dist/app层级变为core/dist/app,原有导入逻辑会直接失效。

更合理的设计思路:

  • 仅将/home/michael/project/src加入sys.path,让core和dist作为src下的子包,结构调整为:
    src/
      core/
        __init__.py
        app/
          __init__.py
          foo/
            __init__.py
      dist/
        __init__.py
        app/
          __init__.py
          bar/
            __init__.py
    
  • 在src下创建无__init__.py的app命名空间包,同时在core/app/__init__.py和dist/app/__init__.py中导入各自子模块:
    # core/app/__init__.py
    from . import foo
    
    # dist/app/__init__.py
    from . import bar
    
    无论dist处于src平级还是移至core内部,只要sys.path包含src,就能通过import app.foo和import app.bar访问模块,完全满足迁移后无需修改导入逻辑的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:45:33