我在main.py 下有一个带有argparse的docker图像
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'])
结果是意料之中的,因为我希望将国家作为数组参数。
但当我调用KubernetsPodOperator中的文件作为cmds参数时,它被检测为字符串
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被检测为1个字符串,然后它变成一个包含1个元素而不是3个元素的数组。是否可以将cmds作为数组发送到命令行的输入?怎么做呀?我也试过这个
cmds=['python',
'main.py',
'--ds=2022-08-30',
'--env=stg',
"--countries=['ID', 'MY', 'SG']"
],
结果是
Namespace(ds='2022-08-30', env='stg', countries=["['ID', 'MY', 'SG']"])
问题是,您将其作为一个参数传递。你想做的是将空格分隔成列表的不同元素:
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
)
如果可以更改argparse参数,可以使用action='append'
作为参数--countries
parser.add_argument("--countries", help="country list", action='append', default=None)
可以使用多个参数调用KPO
cmds=['python',
'main.py',
'--ds=2022-08-30',
'--env=stg',
"--countries=ID",
"--countries=MY",
"--countries=SG"
],
它将返回
Namespace(ds='2022-08-30', env='stg', countries=['ID', 'MY', 'SG'])
在命令行中,使用此命令调用它
python main.py
--ds 2022-08-30
--env stg
--countries ID --countries MY --countries SG