AMLS中PythonScriptStep()传递ds_consumption参数时解析报错问题
Azure Machine Learning 管道新增数据集参数后argparse解析报错修复
问题复现
初始构建Azure ML管道时,通过PythonScriptStep向评分脚本传递普通参数、挂载路径参数,运行状态正常。
正常运行的步骤定义代码:
scoring_step1 = PythonScriptStep( name="Scoring_Step1", source_directory='./source_directory', script_name="scoring1.py", arguments=[ '--input-data-label', input_data_label, '--input-data-folder', input_datasetfiles.as_named_input(input_data_label).as_mount(), '--output-data-folder-name', cache_folder_name, '--output-data-folder', cache_data_folder, '--message', "This is a test message" ], outputs=[cache_data_folder], compute_target=aml_compute, runconfig=pipeline_run_config, allow_reuse=False )
对应scoring1.py中通过ArgumentParser接收参数的代码:
# Get parameters parser = argparse.ArgumentParser() # argument names need to have the same name when you call them somewhere else parser.add_argument("--input-data-label", type=str, dest='input_data_label', default='input_data_label', help='given input data label') parser.add_argument("--input-data-folder", type=str, dest='not_important_when_as_mount', help='arbitrary text') parser.add_argument('--output-data-folder-name', type=str, dest='output_data_folder_name', default='output_data_folder_name', help='given output data folder name') parser.add_argument('--output-data-folder', type=str, dest='output_data_folder', default='output_data_folder', help='Folder for results') parser.add_argument('--message', type=str, dest='message', default='Hallo Alex', help='Folder for results') args = parser.parse_args() input_data_label = args.input_data_label output_data_folder_name = args.output_data_folder_name output_data_folder_path = args.output_data_folder # get the path to the datafolder when using "PipelineData" message = args.message
后续新增流程所需的动态数据集参数ds_consumption后,参数传递逻辑失效,步骤定义修改为:
customer_dataset = Dataset.get_by_name(ws, name='Dreg_Test') pipeline_param = PipelineParameter(name="pipeline_param", default_value=customer_dataset) ds_consumption = DatasetConsumptionConfig("dataset", pipeline_param) scoring_step2 = PythonScriptStep( name="Scoring_Step2", source_directory='./source_directory', script_name="scoring2.py", arguments=[ '--ds_consumption', ds_consumption, '--input-data-label', input_data_label, '--input-data-folder', input_datasetfiles.as_named_input(input_data_label).as_mount(), '--output-data-folder-name', cache_folder_name, '--output-data-folder', cache_data_folder, '--message', "This is a test message" ], inputs=[ds_consumption], outputs=[cache_data_folder], compute_target=aml_compute, runconfig=pipeline_run_config, allow_reuse=False )
scoring2.py中新增数据集读取逻辑:
# Get the experiment run context run = Run.get_context() dataset = run.input_datasets["dataset"] data = dataset.to_pandas_dataframe() # End the run run.complete()
运行scoring2.py时,代码执行到args = parser.parse_args()行即抛出未识别参数的错误,无法定位根因。
根本原因
报错由两个常见的SDK使用误区导致:
- 新增了
--ds_consumption传参项,但未在scoring2.py的ArgumentParser中注册对应参数,argparse遇到未定义的传入参数会直接抛出解析错误。 - 对同一个
ds_consumption数据集配置,既在inputs列表中声明,又在arguments列表中重复传递,会导致运行时实际传入脚本的参数顺序错位,触发解析失败。
修复方案
按以下步骤排查调整即可恢复正常运行:
- 首先统一数据集传递逻辑,二选一即可,不要重复配置:
- 方案1(匹配现有
run.input_datasets读取逻辑,推荐):直接删除arguments列表中的'--ds_consumption', ds_consumption两行,仅保留inputs=[ds_consumption]配置。这种方式下数据集不需要走argparse传递,现有读取数据集的代码可以正常运行,完全不会干扰其他普通参数的解析。 - 方案2(如果需要通过argparse获取数据集挂载路径):删除
inputs=[ds_consumption]配置,修改arguments中数据集项为'--ds_consumption', ds_consumption.as_mount(),同时在scoring2.py的argparse中补充对应参数定义:
解析后拿到的parser.add_argument("--ds_consumption", type=str, dest='ds_consumption_path', help='挂载后的数据集本地路径')args.ds_consumption_path就是数据集挂载的本地路径,可直接通过pandas等库读取文件。
- 方案1(匹配现有
- 如果调整后仍报参数解析错误,检查是否存在手动将数据集配置转成字符串拼接传参的情况:直接将
DatasetConsumptionConfig对象作为arguments列表的独立元素传递时,SDK会自动处理带空格、特殊字符的挂载路径转义,手动转字符串反而会导致路径被空格拆分,触发argparse解析错误。
内容的提问来源于stack exchange,提问作者randomnickname
相关产品推荐
相关产品推荐

