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

在Jupyter Notebook中配置Google Drive API遇参数识别错误

解决Jupyter Notebook中Google Drive API run_flow 参数识别错误的问题

我之前也碰到过完全一样的坑!问题根源很明确:Jupyter启动内核时会自动附加额外的命令行参数(就是你错误信息里的-f /Users/miguel/Library/Jupyter/runtime/kernel-xxx.json),而旧版的tools.run_flow会尝试解析所有命令行参数,导致它把Jupyter的内核参数当成了自己的未知参数,从而报错。

这里给你两个可靠的解决办法,按推荐程度排序:

方法1:使用官方推荐的新版授权方法(更简洁)

现在Google API客户端库已经推荐用InstalledAppFlow.run_local_server()替代旧的tools.run_flow,这个方法完全不依赖命令行参数,完美适配Jupyter这类交互式环境。替换后的代码示例如下:

from google_auth_oauthlib.flow import InstalledAppFlow
from google.oauth2.credentials import Credentials

# 定义你需要的权限范围(根据你的上传需求,这里用drive.file足够)
SCOPES = ['https://www.googleapis.com/auth/drive.file']

# 加载凭据文件,启动本地授权服务器
flow = InstalledAppFlow.from_client_secrets_file(
    'credentials.json',  # 替换成你的凭据文件路径
    SCOPES
)
creds = flow.run_local_server(port=0)  # port=0会自动找可用端口

# 保存授权令牌,下次运行无需重新授权
with open('token.json', 'w') as token_file:
    token_file.write(creds.to_json())

运行这段代码后,会自动弹出浏览器让你授权,授权完成后令牌会保存到token.json,后续直接加载这个文件就能使用,全程不会受到Jupyter命令行参数的干扰。

方法2:修复旧版tools.run_flow的参数问题

如果你坚持要用原来的tools.run_flow,可以手动指定argv参数为空列表,让它忽略所有命令行参数:

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import Flow
from google.auth.transport.requests import Request
import pickle
import os.path
from googleapiclient.errors import HttpError
from oauth2client import tools

SCOPES = ['https://www.googleapis.com/auth/drive.file']

store = pickle.load(open('token.pickle', 'rb')) if os.path.exists('token.pickle') else None
if not store or not store.valid:
    if store and store.expired and store.refresh_token:
        store.refresh(Request())
    else:
        flow = Flow.from_client_secrets_file(
            'credentials.json', SCOPES)
        # 关键修改:手动指定argv为空列表,避免解析Jupyter的参数
        creds = tools.run_flow(flow, store, argv=[])
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

或者你也可以临时修改sys.argv,过滤掉Jupyter的参数后再恢复:

import sys
# 保存原始命令行参数
original_argv = sys.argv.copy()
# 只保留脚本名,清空其他参数
sys.argv = [sys.argv[0]]
# 执行run_flow
creds = tools.run_flow(flow, store)
# 恢复原始参数,避免影响后续代码
sys.argv = original_argv

两种方法都能解决参数识别错误的问题,不过还是更推荐方法1,毕竟是官方现在主推的写法,代码也更简洁易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:41