背景:
1.代码:
def _parse_args(self):
parser = argparse.ArgumentParser(description=“Eval the model”)
parser.add_argument(
“–model_name_or_path”,
type=str,
help=“path or model”,
default=“jeffding/bark-openmind”,
)
args = parser.parse_args()
return args
2.报错:
usage: ipykernel_launcher.py [-h] [--model_name_or_path MODEL_NAME_OR_PATH]
ipykernel_launcher.py: error: unrecognized arguments: -f /home/openmind/.local/share/jupyter/runtime/kernel-69dba323-065d-4f09-b489-41891f901294.json
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
**原因:**在 Jupyter Notebook 中运行 argparse 时,它会尝试解析 Jupyter 自动添加的内核参数(如 -f /path/to/kernel.json),但您的解析器没有定义这些参数,导致错误。
解决方法:
完整修复方案
def _parse_args(self):
# 创建解析器时禁用默认的 sys.argv 使用
parser = argparse.ArgumentParser(
description="Eval the model",
add_help=False # 禁用默认的 -h/--help 参数
)
# 添加自定义参数
parser.add_argument(
"--model_name_or_path",
type=str,
help="path or model",
default="jeffding/bark-openmind",
)
# 手动指定参数列表(空列表表示不使用任何命令行参数)
args, _ = parser.parse_known_args(args=[])
return args
-------在Jupyter notebook成功解决,没解决的继续看下面的------------------------------------------
详解:
这个错误发生在 Jupyter Notebook 环境中,因为 argparse
模块尝试解析 Jupyter 自动传递的内核参数。让我提供完整的修复方案:
根本原因
在 Jupyter Notebook 中运行 argparse
时,它会尝试解析 Jupyter 自动添加的内核参数(如 -f /path/to/kernel.json
),但您的解析器没有定义这些参数,导致错误。
完整修复方案
def _parse_args(self):
# 创建解析器时禁用默认的 sys.argv 使用
parser = argparse.ArgumentParser(
description="Eval the model",
add_help=False # 禁用默认的 -h/--help 参数
)
# 添加自定义参数
parser.add_argument(
"--model_name_or_path",
type=str,
help="path or model",
default="jeffding/bark-openmind",
)
# 手动指定参数列表(空列表表示不使用任何命令行参数)
args, _ = parser.parse_known_args(args=[])
return args
替代方案:完全避免使用 argparse
更好的解决方案是重构代码,完全避免在类中使用 argparse
:
class SignLanguageTranslator:
def __init__(self, model_name="jeffding/bark-openmind"):
self.model_name = model_name
self._init_model()
def _init_model(self):
"""初始化模型,避免每次调用都加载"""
# 设置设备
if torch.npu.is_available():
self.device = "npu"
elif torch.cuda.is_available():
self.device = "cuda"
else:
self.device = "cpu"
print(f"Using device: {self.device}")
# 加载模型
self.processor = AutoProcessor.from_pretrained(self.model_name)
self.model = AutoModel.from_pretrained(self.model_name).to(self.device)
print(f"模型 {self.model_name} 加载完成")
# 其他方法保持不变...
在 Jupyter 中使用的方法
# 创建实例时直接指定模型
translator = SignLanguageTranslator(model_name="jeffding/bark-openmind")
# 或者使用默认模型
translator = SignLanguageTranslator()
# 生成音频
audio = translator.text_to_speech_suno("你的歌词文本")
为什么这是更好的解决方案?
- 避免环境依赖问题:完全消除与 Jupyter 内核参数的冲突
- 更清晰的代码结构:参数直接通过构造函数传递,而非解析命令行
- 更好的可重用性:可在各种环境(脚本、Web 应用、Jupyter)中使用
- 更易调试:没有隐藏的命令行参数解析
如果必须保留 argparse
功能
如果您需要支持命令行参数(当作为脚本运行时),可以这样修改:
def _parse_args(self):
# 仅在直接运行脚本时解析真实参数
if 'ipykernel' not in sys.modules:
parser = argparse.ArgumentParser(description="Eval the model")
parser.add_argument(
"--model_name_or_path",
type=str,
default="jeffding/bark-openmind",
)
return parser.parse_args()
else:
# 在 Jupyter 中使用默认值
class Args:
model_name_or_path = "jeffding/bark-openmind"
return Args()
然后在类初始化中使用:
def __init__(self):
self.args = self._parse_args()
self._init_model(self.args.model_name_or_path)
这个解决方案既保留了命令行参数支持,又确保在 Jupyter 中不会出错。