1、argparse命令行参数&&python环境变量

一、参数说明:

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 有效。
而上面的这种设置环境变量的方式只对当前脚本有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值