argparse命令行参数
一、参数说明:
name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
action - 当参数在命令行中出现时使用的动作基本类型,action - 命令行遇到参数时的动作,默认值是 store。
– store_const,表示赋值为const;
– append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
– append_const,将参数规范中定义的一个值保存到一个列表;
– count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
nargs是用来说明传入的参数个数,‘+’ 表示传入至少一个参数
nargs - 应该读取的命令行参数个数,可以是
具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const
或者是 * 号,表示 0 或多个参数;
或者是 + 号表示 1 或多个参数。
const - 被一些 action 和 nargs 选择所需求的常数。
default - 当参数未在命令行中出现时使用的值。
type - 命令行参数应当被转换成的类型。(int,list, str, tuple, set, dict)
choices - 可用的参数的容器。
required - 此命令行选项是否可省略,默认false 。
help - 一个此选项作用的简单描述。
metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。
二、参数用法
1、name
参数名是为了在使用时可以直接调用 args.name
有两种参数名的设置方式,差异体现在名称前有没有 – 或者 - (名称缩写的时候)
必写参数 (没有-):按照设置的先后顺序对应读取,调用时不用写名称
可选参数 (有-):可以无序读取,调用时要写名称
2、位置参数
在命令行中传入参数时候,传入的参数的先后顺序不同,运行结果往往会不同,这是因为采用了位置参数,例如
import argparse
parser = argparse.ArgumentParser(description=‘姓名’)
parser.add_argument(‘param1’, type=str,help=‘姓’)
parser.add_argument(‘param2’, type=str,help=‘名’)
args = parser.parse_args()
#打印姓名
print(args.param1+args.param2)
#定义位置参数:
parser.add_argument(‘outfile’)
3、可选参数
为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加–,可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱。例如:
以上输入必须半径1在前,高度3在后,如果想改变输入的顺序或在输入参数同时携带参数名,可以使用选择型参数,在添加参数时参数名前加两个"-"
parser.add_argument(‘–radius’, type=int, help=‘Radius of cylinder’)
还有一种方法,通过“-”加上参数别名的形式,注意被"–"修饰的参数名必须存在:
parser.add_argument(‘-r’, ‘–radius’, type=int, help=‘Radius of cylinder’)
parser.add_argument(‘-H’, ‘–height’, type=int, help=‘Height of cylinder’)
4、nargs
用来说明传入的参数的个数,可以是
具体数字:要传进来几个
‘*’:任意个 any
‘?’:一个或者没有 1/0
‘+’:至少一个 ≥1
后期你调出这个参数的时候,它是一个list的形式储存你传入的东西
那我们改进一下上面求两个整数和的程序
import argparse
parser = argparse.ArgumentParser(description=‘此代码用于求两个整数之和’)
#这个parse对象相当于一个总容器,存放着全部的信息
parser.add_argument(“integers”, type=int,nargs=2,help=“第一个整数”)
5、type
type用来决定,你是以什么样的数据类型把参数读进来的
默认的话是字符串,跟input函数一样
6、 required属性
在添加参数那步可以自选添加required属性,在命令行输入的过程中如果你只具体指定了某几个参数,还有其它参数的值没有指定,也许可以运行完程序,那个没有被具体指定值的参数会被赋None值。required属性要求该参数必须被赋值,否则报错
parser.add_argument(‘-r’, ‘–radius’, type=int, metavar=‘’, required=True, help=‘Radius of cylinder’)
parser.add_argument(‘-H’, ‘–height’, type=int, metavar=‘’, required=True, help=‘Height of cylinder’)
7、dest属性
可以通过dest=xxx来设置参数的变量名取代“–xxx”,同样地在代码中用args.xxx来获取参数的值。
parser.add_argument(‘-r’, dest=‘radius’, type=int, help=‘Radius of cylinder’)
parser.add_argument(‘-H’, dest=‘height’, type=int, help=‘Height of cylinder’)
8、action使用互斥参数
三、argparse与dict相互转化
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--face', help='use this face', dest='source_img')
parser.add_argument('-t', '--target', help='replace this face', dest='target_path')
parser.add_argument('-o', '--output', help='save output to this file', dest='output_file')
parser.add_argument('--keep-fps', help='maintain original fps', dest='keep_fps', action='store_true', default=False)
parser.add_argument('--keep-frames', help='keep frames directory', dest='keep_frames', action='store_true', default=False)
parser.add_argument('--all-faces', help='swap all faces in frame', dest='all_faces', action='store_true', default=False)
parser.add_argument('--max-memory', help='maximum amount of RAM in GB to be used', dest='max_memory', type=int)
parser.add_argument('--cpu-cores', help='number of CPU cores to use', dest='cpu_cores', type=int, default=max(8 / 2, 1))
parser.add_argument('--gpu-threads', help='number of threads to be use for the GPU', dest='gpu_threads', type=int, default=8)
parser.add_argument('--gpu-vendor', help='choice your GPU vendor', dest='gpu_vendor', choices=['apple', 'amd', 'intel', 'nvidia'])
args = parser.parse_known_args()[0]
print('所有参数:',args)
print('图片参数:',args.source_img)
print('---------------------------------------')
# 此时得到的configs为Namespace类型,它包含了__dict__属性,
# 因此可以使用vars将configs转换为字典dic(只要变量包含了__dict__属性就可以使用vars转换为字典)
print('类型argperser:',type(args))
dic = vars(args)
print('类型dict:', type(dic))
print('---------------------------------------')
# 1、argparser转字典
args_dict = vars(args)
# use the dict
for k in args_dict.keys():
print(k, args_dict[k], type(args_dict[k]))
print('---------------------------------------')
# 2、 dict 转ArgumentParser
# create a dict object
a_student = {'Name': 'JACK Williams',
'ID': 391568,
'At_School': True,
'Math_Score': 92.3}
# transfer the dict object to an ArgumentParser object
args = argparse.Namespace(**a_student)
print('类型argparser:', type(args))
# use the ArgumentParser object
print(args.Name, type(args.Name))
print(args.ID, type(args.ID))
print(args.At_School, type(args.At_School))
print(args.Math_Score, type(args.Math_Score))
if __name__ == '__main__':
main()
# 运行参考
# python run.py --gpu-vendor nvidia --keep-fps --all-faces -f img/face/mimi.jpg -t img/video/nui.mp4 -o img/out/nui.mp4
四、参考代码
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a cylinder')
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of cylinder')
# 添加互斥组
group = parser.add_mutually_exclusive_group()
# 给互斥组添加两个参数
# 给参数的action属性赋值store_true,程序默认为false,当你执行这个命令的时候,默认值被激活成True
group.add_argument('-q', '--quiet', action='store_true', help='Print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='Print verbose')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius**2) * (height) # 体积公式
return vol
if __name__ == '__main__':
volume = cylinder_volume(args.radius, args.height)
# 互斥参数
if args.quiet:
print(volume)
elif args.verbose:
print('Volume of a Cylinder with radius %s and height %s is %s' % (args.radius, args.height, volume))
else:
print('Volume of Cylinder = %s' % volume)
# 这就是互斥参数如何工作的,你不能同时执行两个命令,你可以执行一个,所以和互斥组里的两个参数交互时,你只能
# 执行quiet和verbose中的一个,或者是都不执行按照默认计划来
# 使用: python test_argparse.py -r 2 -H 4
# python test_argparse.py -r 2 -H 4 -v
# python test_argparse.py -r 2 -H 4 -q
9、metavar - 在使用方法消息中使用的参数值示例,协助-h参数查看描述信息。
3、程序
# backup.py
import argparse
def main():
# 定义一个ArgumentParser实例:
parser = argparse.ArgumentParser(
prog='backup', # 程序名
description='Backup MySQL database.', # 描述
epilog='Copyright(r), 2023' # 说明信息
)
# 定义位置参数:
parser.add_argument('outfile')
# 定义关键字参数:
parser.add_argument('--host', default='localhost')
# 此参数必须为int类型:
parser.add_argument('--port', default='3306', type=int)
# 允许用户输入简写的-u:
parser.add_argument('-u', '--user', required=True)
parser.add_argument('-p', '--password', required=True)
parser.add_argument('--database', required=True)
# gz参数不跟参数值,因此指定action='store_true',意思是出现-gz表示True:
parser.add_argument('-gz', '--gzcompress', action='store_true', required=False, help='Compress backup files by gz.')
# 解析参数:
args = parser.parse_args()
print('解析完参数:',args)
print('类型:',type(args))
args.outfile='take a set'
# 打印参数:
print('parsed args:')
print(f'outfile = {args.outfile}')
print(f'host = {args.host}')
print(f'port = {args.port}')
print(f'user = {args.user}')
print(f'password = {args.password}')
print(f'database = {args.database}')
print(f'gzcompress = {args.gzcompress}')
if __name__ == '__main__':
main()
# $ ./backup.py -u root -p hello --database testdb backup.sql
参考: https: // blog.csdn.net / RudeTomatoes / article / details / 117003291
https: // zhuanlan.zhihu.com / p / 56922793
五、python 运行时指定环境变量
环境变量已经存在系统中, 平时在 python 脚本中直接通过 os.getenv(‘ENV_NAME’) 就能拿到指定的环境变量。除此以外,还可以在 python 运行时指定环境变量。
测试代码:
# demo.py
import os
VAR1 = os.getenv('VAR1')
VAR2 = os.getenv('VAR2')
print(f"var1:{VAR1}")
print(f"var2:{VAR2}")
运行脚本时给定环境变量
VAR1="test env variable" VAR2=12 python demo.py
脚本可以拿到环境变量,但是在系统中用 env 命令是查不到的。
export 是临时环境变量,只在当前 shell 有效。
而上面的这种设置环境变量的方式只对当前脚本有效。