项目场景:
IDE当中代码使用了parser.parse_args(),当在jupyter下调用时出错。
问题描述
报错:
usage: ipykernel_launcher.py [-h] [--data_dir DATA_DIR]
[--output_dir OUTPUT_DIR]
[--embedding_path EMBEDDING_PATH]
.....
ipykernel_launcher.py: error: unrecognized arguments: -f /home/xxx/.local/share/jupyter/runtime/kernel-0fad9201-af20-4945-86b4-eeafe5b0d8b2.json
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
原因分析:
这是因为调用parser.parse_args()会读取系统参数:sys.argv[],命令行调用时是正确参数,而在jupyter notebook中调用时,sys.argv的值为ipykrnel_launcher.py:
['/home/xxx/anaconda3/envs/pt/lib/python3.8/site-packages/ipykernel_launcher.py',
'-f',
'/home/xxx/.local/share/jupyter/runtime/kernel-0fad9201-af20-4945-86b4-eeafe5b0d8b2.json']
解决方案:
解决方案有两种,一种需要修改代码,第二种只需要在jupyter中设置sys.argv。
一、修改代码
将parser.parse_args() 改为 parser.parse_known_args()[0]
import argparse
parser = argparse.ArgumentParser()
args = parser.parse_known_args()[0]
缺点
需要修改代码,不优雅。
修改系统参数
在jupyter中设置sys.argv。
1.获取正确的sys.argv
比如输入命令行为:
python run.py
其sys.argv为:
['run.py']
提示:也可以在运行代码中添加print(sys.argv)获取,形式如下:
import sys
print(sys.argv)
修改sys.argv
在jupyter中添加如下代码:
import sys
sys.argv = ['run.py']
代码中的,‘run.py’修改为当前运行代码所需的sys.argv
强迫症不想修改代码的,可以用第二种方法试试。
参考文献:
tf2.2运行SSD目标检测,出现错误ipykernel_launcher.py: error: unrecognized arguments: