Jupyter Notebook中调用argparse.parse_args()报SystemExit:2错误如何修复
错误原因
- argparse参数配置逻辑冲突:你给
--q、--max-results两个参数同时设置了required=True和default值,required=True的优先级高于默认值,会强制要求必须从命令行传递这两个参数,你设置的默认值不会生效。 - 运行环境不匹配argparse默认取值逻辑:从报错信息里的
ipykernel_launcher.py可以看出你是在Jupyter Notebook/IPython环境下运行代码,argparse默认从系统启动参数中读取配置,而Jupyter内核启动时自带的参数里没有你定义的--q、--max-results,因此会判定参数缺失。 - 函数内部存在隐藏报错点:你在循环中直接使用了
videoId、videoIds两个变量,但没有提前定义也没有从接口返回结果中取值,后续即使参数问题解决也会触发未定义变量报错。
修复方案
1. 适配Jupyter运行环境
把required=True参数删掉,同时改用parser.parse_known_args()替代parser.parse_args(),忽略Jupyter内核自带的多余参数,让你配置的默认值可以正常生效。
如果是在本地Python命令行环境运行代码,不需要修改argparse配置,运行时直接传递参数即可:python 你的脚本文件名.py --q "Spider-Man Movie Trailer 2021" --max-results 1
2. 修复函数内部变量问题
从搜索结果中正确取出videoId,提前初始化videoIds列表,优化返回逻辑避免无结果时返回未定义变量。
修复后完整代码
import argparse from googleapiclient.discovery import build # 请补充你自己的YouTube Data API密钥 key = "你的API密钥" videoIds = [] def youtube_video_url(options): youtube = build('youtube', 'v3', developerKey = key) search_response = youtube.search().list(q = options.q, part = "id,snippet", maxResults = options.max_results).execute() url = "" for search_result in search_response.get("items", []): if search_result["id"]["kind"] == "youtube#video": # 从接口返回结果中正确提取videoId videoId = search_result["id"]["videoId"] print("VideoId: " +str(videoId)) videoIds.append(videoId) url = "https://www.youtube.com/watch?v=" + videoId print(url) return url if __name__ == "__main__": print( "Enter the Movie Name : ") Movie_name = str(input()) parser = argparse.ArgumentParser(description = "youtube search") # 移除required=True让默认值生效 parser.add_argument("--q", help = "Search term", default = Movie_name + " Movie Trailer 2021") parser.add_argument("--max-results", help = "Max results", default = 1) # 改用parse_known_args忽略Jupyter自带的多余参数 args, unknown = parser.parse_known_args() video_url = youtube_video_url(args) if video_url: scrape_comments(video_url, Movie_name) else: print("未搜索到对应视频,请检查搜索关键词、API配额或接口权限")
内容的提问来源于stack exchange,提问作者nita
相关产品推荐
相关产品推荐

