Python3.8调用Google Drive API报AttributeError: time无clock属性
报错根因定位
触发该错误的核心原因是依赖库版本与Python 3.8的接口不兼容:
- Python 3.8版本正式移除了标准库中
time模块下的clock()方法,官方替代方案为time.perf_counter() - 你当前安装的老旧PyCrypto加密库仍在调用已被删除的
time.clock()接口,结合已停止维护的oauth2client鉴权库,在生成JWT签名获取访问凭证的流程中直接触发属性不存在的报错 - 从错误堆栈可以看到,问题发生在RSA签名的随机数生成环节,并非Google API服务本身的问题
可落地的解决方案
方案1:替换已弃用的旧依赖(官方推荐长期使用)
oauth2client早在2022年就被Google官方正式废弃,替换为当前官方维护的鉴权组件可以从根源上解决全链路的版本兼容问题,操作步骤如下:
- 卸载当前存在兼容问题的旧依赖
pip uninstall oauth2client pycrypto httplib2 - 安装适配Python 3.8+的官方Google API组件
pip install google-auth google-api-python-client google-auth-httplib2 - 调整原有鉴权代码的写法,保持原有功能逻辑不变的同时适配新依赖:
import os from google.oauth2.service_account import Credentials from googleapiclient.discovery import build from googleapiclient.http import AuthorizedHttp # 保持原有环境变量读取逻辑 key_path = os.environ["GOOGLE_APPLICATION_CREDENTIALS"] SCOPE = [ 'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive' ] # 初始化新版服务账号凭证 credentials = Credentials.from_service_account_file(key_path, scopes=SCOPE) # 构建授权HTTP客户端 http = AuthorizedHttp(credentials) # 正常构建Drive API服务实例 drive = build('drive', 'v3', http=http)
方案2:临时修复兼容问题(适合短期不想改动代码的场景)
如果暂时不方便调整现有业务代码,可以直接替换存在兼容问题的PyCrypto库为维护中的兼容分支,操作步骤:
- 卸载存在兼容问题的旧PyCrypto库
pip uninstall pycrypto - 安装适配Python 3.8+的PyCrypto维护版本
pip install pycryptodome注意:该方案仅为临时修复,由于
oauth2client已经停止官方维护,后续仍可能出现其他版本兼容问题,长期使用建议切换为方案1的官方依赖栈。
常见避坑提示
不要手动修改PyCrypto源码中time.clock()的调用为time.perf_counter(),老旧版本的PyCrypto除了该接口问题外,还存在多轮随机数生成、编码处理等其他Python3.8+的兼容缺陷,单独修改一处仍会触发后续报错,直接替换兼容版本是效率最高的修复方式。
内容的提问来源于stack exchange,提问作者user6308605
相关产品推荐
相关产品推荐

