在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
相关产品推荐
相关产品推荐

