如何在argparse.add_argument中使用1、2、3作为无短横线命令行参数
解决方案
你遇到的问题本质是两个:
- Python 对象的属性名不允许以数字开头,所以
args.1不符合语法规则 - 你需要的是无短横线前缀的位置参数,而非原来带
-前缀的可选参数,不需要为每个数值单独定义参数
最优实现方案(位置参数版,符合你要的$script.py 1调用方式)
直接定义单个位置参数接收数值,同时自带参数校验,修改后的代码如下:
import argparse def main(): parser = argparse.ArgumentParser() # 定义位置参数,接收1/2/3三个可选值 parser.add_argument( 'mode', type=int, choices=[1,2,3], help="指定运行的脚本:1=hello-1.py,2=hello-2.py,3=hello-3.py" ) # 如果要保留原来的-l可选参数,取消下面的注释即可 # parser.add_argument('-l', action='store_true', help="列出配置内的文件") args = parser.parse_args() # 可选:如果需要保留-l参数的逻辑,放在最前面处理 # if args.l: # print("List files within config") # return # 不用写多个if分支,直接用参数值拼接文件名更简洁 script_path = f"hello-{args.mode}.py" with open(script_path, "r") as file: exec(file.read()) # 注意:with上下文会自动关闭文件,原来的file.close()是多余的,还可能引发未定义变量报错,已删除 if __name__ == '__main__': main()
方案说明
- 调用方式完全符合需求:直接执行
python script.py 1即可运行hello-1.py,输入不在1/2/3范围内的参数时,argparse会自动输出错误提示和帮助信息,不需要自己写无效参数的判断逻辑 - 后续扩展非常方便:如果要新增支持4、5等参数,只需要在
choices列表里添加对应数值即可,不需要新增参数定义和判断分支
补充:如果需要$script.py -1的短选项形式(非位置参数)
如果后续你需要改成带短横线的数字选项,可以用dest参数指定属性名避开数字开头的问题,写法如下:
parser.add_argument('-1', dest='opt1', action='store_true', help="运行hello-1.py") parser.add_argument('-2', dest='opt2', action='store_true', help="运行hello-2.py") # 访问时用args.opt1、args.opt2即可
内容的提问来源于stack exchange,提问作者Sriram S
相关产品推荐
相关产品推荐

