You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python导入模块时出现newcred.json文件找不到错误求助

解决导入模块时找不到JSON凭证文件的问题

这个问题我之前也踩过一模一样的坑!核心原因是相对路径的参照对象不是模块所在目录,而是当前Python进程的工作目录

问题根源

当你单独运行google_worksheets.py时,Python的当前工作目录就是这个脚本所在的文件夹,所以'newcred.json'这个相对路径能直接定位到文件。但当你从其他路径的脚本导入这个模块时,当前工作目录变成了调用脚本所在的目录,而不是google_worksheets模块的目录,自然就找不到newcred.json了。

完美解决方案:用模块的绝对路径定位文件

修改google_worksheets.py里加载凭证的代码,通过模块自身的位置来拼接JSON文件的绝对路径,这样不管从哪里导入模块都能正确找到文件:

import os
from oauth2client.service_account import ServiceAccountCredentials

class g_sheets:
    def __init__(self):
        # 获取当前模块(google_worksheets.py)所在的绝对目录
        module_dir = os.path.dirname(os.path.abspath(__file__))
        # 拼接凭证文件的绝对路径
        cred_file_path = os.path.join(module_dir, 'newcred.json')
        # 使用绝对路径加载凭证
        self.credentials = ServiceAccountCredentials.from_json_keyfile_name(
            cred_file_path,
            ['https://www.googleapis.com/auth/spreadsheets']  # 替换成你的实际权限范围
        )
        # 后续初始化service的代码...

为什么这招管用?

  • __file__变量会返回当前模块脚本的绝对路径(比如/home/seamus/code/544-dss/controllers/google/google_worksheets.py
  • os.path.dirname()提取出脚本所在的目录(/home/seamus/code/544-dss/controllers/google/
  • os.path.join()把目录和文件名拼接成完整的绝对路径,彻底摆脱对当前工作目录的依赖

其他备选方案(不推荐但可应急)

  • newcred.json复制到调用脚本所在的目录,但这样会导致文件重复,维护起来麻烦
  • 设置一个环境变量(比如GOOGLE_CRED_PATH),在模块里读取这个环境变量来加载文件,适合多环境部署但需要额外配置

内容的提问来源于stack exchange,提问作者Seamus O'Connor

火山引擎 最新活动