Python跨目录导入模块出现ModuleNotFoundError及NameError问题求解
解决方案
问题根源
- 导入错误的核心原因是:从根目录
AppFolder运行main.py时,Python的模块搜索基准路径是AppFolder,synchronization.py中直接写import client会尝试在AppFolder下找client.py,自然找不到。 - 后续
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
相关产品推荐
相关产品推荐

