使用KubernetesPodOperator传递argparse多值参数无法识别为数组的问题
问题:Airflow KubernetesPodOperator传递argparse多值参数失败
我有一个包含argparse逻辑的Docker镜像,main.py代码如下:
parser = argparse.ArgumentParser() # mandatory parameter parser.add_argument("--ds", help="ds", default=None) parser.add_argument("--env", help="env", default=None) parser.add_argument("--countries", help="country list", nargs='+', default=None) args = parser.parse_args() print(args)
直接通过命令行运行时:
python main.py \ --ds 2022-08-30 --env stg --countries ID MY SG
返回结果符合预期:
Namespace(ds='2022-08-30', env='stg', countries=['ID', 'MY', 'SG'])
但使用Airflow的KubernetesPodOperator的cmds参数调用时,--countries参数被识别为单个字符串:
KubernetesPodOperator( task_id=task_id, namespace="xxx", service_account_name="svc-acc", image=f"gcr.io/path/to/image", image_pull_policy="Always", cmds=['python', 'main.py', '--ds=2022-08-30', '--env=stg', "--countries=ID MY SG" ], startup_timeout_seconds=300, dag=dag, **kwargs )
返回结果:
Namespace(ds='2022-08-30', env='stg', countries=['ID MY SG'])
尝试过"--countries=['ID', 'MY', 'SG']"的写法,结果依然不符合预期:
Namespace(ds='2022-08-30', env='stg', countries=["['ID', 'MY', 'SG']"])
请问如何在KubernetesPodOperator的cmds参数中正确传递多值参数,使其被argparse识别为数组?
解决方案
问题根源在于KubernetesPodOperator的cmds列表会将每个元素直接作为命令行参数传递,不会像shell那样解析字符串内的空格或引号。要让argparse正确识别多值参数,需将每个参数项拆分为列表的独立元素,以下两种写法均可:
写法1:拆分参数名与每个值
将--countries作为单独元素,每个国家代码也独立成列表元素:
KubernetesPodOperator( task_id=task_id, namespace="xxx", service_account_name="svc-acc", image=f"gcr.io/path/to/image", image_pull_policy="Always", cmds=['python', 'main.py', '--ds=2022-08-30', '--env=stg', '--countries', 'ID', 'MY', 'SG' ], startup_timeout_seconds=300, dag=dag, **kwargs )
写法2:使用args参数分离命令与参数
若习惯贴近shell的参数格式,可将启动命令放在cmds,所有参数移至args参数中:
KubernetesPodOperator( task_id=task_id, namespace="xxx", service_account_name="svc-acc", image=f"gcr.io/path/to/image", image_pull_policy="Always", cmds=['python', 'main.py'], args=[ '--ds=2022-08-30', '--env=stg', '--countries', 'ID', 'MY', 'SG' ], startup_timeout_seconds=300, dag=dag, **kwargs )
两种写法都能让argparse正确解析countries为包含多个元素的数组,最终得到预期结果:
Namespace(ds='2022-08-30', env='stg', countries=['ID', 'MY', 'SG'])
内容的提问来源于stack exchange,提问作者khusnanadia
相关产品推荐
相关产品推荐

