无法将具有多个值的参数参数解析检测为数组

  • 本文关键字:参数 数组 python argparse
  • 更新时间 :
  • 英文 :


我在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

最新更新