导入Python脚本作为模块时如何传参?以MMDetection视频检测脚本为例
解决方案
问题说明
你之前的调用方式无法生效,因为原脚本的main()没有设计为接受入参,它内部通过parse_args()从命令行读取参数,直接给main()传参不会被识别。
方案1:改造原脚本适配内部调用(推荐)
修改原脚本的main函数,让它支持外部传入参数,同时保留原命令行调用能力:
# 仅需修改main函数的定义和参数读取逻辑,其余代码保持不变 def main(args=None): # 没有外部传参时走原命令行解析逻辑 if args is None: args = parse_args() assert args.out or args.show, \ ('Please specify at least one operation (save/show the ' 'video) with the argument "--out" or "--show"') # 后续逻辑和原代码完全一致 model = init_detector(args.config, args.checkpoint, device=args.device) # ... 其余原代码无需改动
调用示例
在你自己的脚本中按如下方式调用:
from argparse import Namespace # 假设你的原脚本保存为 mmdet_video_infer.py import mmdet_video_infer # 构造和命令行参数对应的Namespace对象 run_args = Namespace( video=vid, # 你自己的视频路径变量 config=config_file, # 你自己的配置文件路径变量 checkpoint=chkpnt_file, # 你自己的权重文件路径变量 device="cuda:0", score_thr=0.7, show=True, out=None, # 不需要保存输出视频就设为None,需要保存就传输出路径字符串 wait_time=1 ) # 直接调用传参 mmdet_video_infer.main(run_args)
方案2:不修改原脚本,模拟命令行调用
如果不想改动原脚本,可以用subprocess模块模拟命令行执行:
import subprocess # 拼接命令行参数 run_cmd = [ "python", "原脚本的完整路径.py", vid, config_file, chkpnt_file, "--score-thr", "0.7", "--show" ] # 执行调用,check=True表示执行出错会抛出异常 subprocess.run(run_cmd, check=True)
方案对比
- 方案1灵活性更高,后续如果需要获取推理中间结果、修改逻辑也更方便,适合长期使用
- 方案2无需改动原代码,适合临时调用的场景
内容的提问来源于stack exchange,提问作者redeemedByRedeemer
相关产品推荐
相关产品推荐

