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

Python跨目录导入模块出现ModuleNotFoundError及NameError问题求解

解决方案

问题根源

  1. 导入错误的核心原因是:从根目录AppFolder运行main.py时,Python的模块搜索基准路径是AppFolder,synchronization.py中直接写import client会尝试在AppFolder下找client.py,自然找不到。
  2. 后续NameError的原因是:当main.py导入synchronization.py时,synchronization.py的__name__不等于__main__,放在if __name__ == '__main__'块内的导入和main()执行逻辑都不会运行,service变量从未被定义。

修复步骤

第一步:标记Google为Python包

在Google文件夹下新建一个空文件,命名为__init__.py,让Python将该文件夹识别为可导入的包。

第二步:修正synchronization.py的导入语句

将synchronization.py开头的导入改为同目录相对导入:

from . import client

也可以用绝对导入:

from Google import client

第三步:优化service变量实现(替换全局变量方案)

不要用直接暴露的全局变量,改用懒加载的私有变量存储service实例,避免未初始化的问题,完整synchronization.py代码如下:

from . import client

# 私有变量存储service实例,避免全局污染
_service = None

def init_service():
    """初始化谷歌API连接,仅首次调用时执行"""
    global _service
    if _service is None:
        _service = client.main()
    return _service

def get_events():
    # 调用前先确保service已初始化
    service = init_service()
    return service.events().list(calendarId = 'primary').execute()

# 单独运行synchronization.py时的入口
if __name__ == '__main__':
    init_service()
    # 此处可加单独运行时的其他逻辑

第四步:main.py无需修改

原有main.py的导入逻辑可以直接正常运行:

import Google.synchronization as googleCalendar

def main():
    events = googleCalendar.get_events()
    # 后续处理events的逻辑

if __name__ == '__main__':
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:45:02