命令行运行Python脚本时传入参数的几种方式

Published: by Creative Commons Licence

sys.argv 模块

  • 这是基于位置的参数传入。根据输入参数的位置,分配给对应的脚本文件。此时要特别注意参数顺序的一一对应。
  • 所有的参数都会被默认为str类型,需要在函数内部进行解析和转换。(在下面的例子中是使用float()转换变量类型。)

此时我们有Python脚本script.py.

import sys

def add(a, b):
    print(float(a)+float(b))

if __name__ == '__main__':
    arg1, arg2 = sys.argv[1], sys.argv[2]   # 接收位置参数
    add(arg1, arg2)

命令行执行代码如下:

python script.py 3.0 4.0

argparse 模块

  • 利用argparse模块,在函数内定义好相关的命名参数(包括名称、数据类型、默认值、是否为必要输入参数等),从而在命令行中可以方便的调用。
  • 其中add_argument()中设定的变量数据类型,理论上可以是任何合法的类型,但一般仅使用bool, int, str, float这些基本类型,更复杂的类型可以在这些基本类型的基础上进行解析,比如str

使用此模块时,python脚本如下:

import argparse

def add(a, b):
    print(float(a)+float(b))

parser = argparse.ArgumentParser(description='a demo of script')
parser.add_argument('--add-f', '-a', type=float, default=0.0)  # 添加变量
parser.add_argument('--bf', type=float, default=1.0)

if __name__ == '__main__':
    args = parser.parse_args()   # 解析所有的命令行传入变量
    add(args.add_f, args.bf)

具体的命令行运行python脚本如下(下面是几种写法):

python script.py --a-f=4.0 --bf=3.0
python script.py --a-f 4.0 --bf 3.0
python script.py --add 4 --b 4
python script.py --ad 4 --b 4
python script.py --a 4 --b 4
python script.py -a 4 --b 4

对于任意python脚本,我们可以通过下面两者之一获得帮助。

python script.py -h
python script.py --help

下面来一个更加详细的代码展示(来自YOLOv5官方源代码):

def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
    parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')
    ...
    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    print_args(vars(opt))
    return opt

def main(opt):
    check_requirements(exclude=('tensorboard', 'thop'))
    run(**vars(opt))

if __name__ == "__main__":
    opt = parse_opt()
    main(opt)