Python3 命令行参数解析

2022-09-05 14:18:41 浏览数 (1)

Contents

  • 1 sys.argv用法
  • 2 argparse 模块用法
    • 2.1 理解 add_argument() 方法
    • 2.2 argparse示例
  • 3 参考资料

sys.argv,这种方法比较古老,灵活性很差,同时解析出来的参数都是 str 类型。但在编写简单脚本,参数较少且固定时比较方便。argparse 模块是 Python 标准库中推荐的命令行解析模块,命令行参数解析在 windows 系统下不适用,但在 linux 系统下几乎要总是考虑命令行参数解析。

sys.argv用法

  • sys.argv[] 获取的是命令行参数列表,sys.argv[0] 表示代码本身文件路径,所以命令行参数从sys.argv[1] 开始。
  • len(sys.argv) 获取的 是命令行参数个数。

新建 demo.py,并输入以下 代码:

代码语言:javascript复制
# -*-coding-*-: utf-8
import sys
a=sys.argv[0]  # sys.argv[0]永远表示的是你运行的程序文件名
b=sys.argv[1]
c=sys.argv[2]
print("filename:",a)
print("param1:",b)
print("param2:",c)

终端中运行:python demo.py honggao zhang。输出如下:

(‘filename:’, ‘demo.py’)  (‘param1:’, ‘honggao’)  (‘param2:’, ‘zhang’)

argparse 模块用法

在模型训练程序中,我们经常要配置命令参数,这里可用到 argparse 模块,它是 Python 内置的一个用于命令选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。 使用 argparse 模块解析命令行参数,主要分三个步骤:创建解析器、添加参数、解析参数,步骤如下:

  • 创建 ArgumentParser() 对象
  • 调用 add_argument() 方法添加参数:定位参数、可选参数和混合使用参数
  • 使用 parse_args() 解析添加参数

理解 add_argument() 方法

add_argument() 方法定义了如何解析命令行参数: 

代码语言:javascript复制
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name or flags – 选项字符串的名字或者列表,例如 foo 或者 -f, –foo。
  • action – 命令行遇到参数时的动作,默认值是 store。
    • store_const,表示赋值为 const 的相反值,比如 store_true,代表参数赋值为 false
    • append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
    • append_const,将参数规范中定义的一个值保存到一个列表;
    • count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
  • nargs – 应该读取的命令行参数个数,可以是具体的数字,或者是 ? 号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 号表示 1 或多个参数。
  • const – action 和 nargs 所需要的常量值。
  • default – 不指定参数时的默认值。
  • type – 命令行参数应该被转换成的类型。
  • choices – 参数可允许的值的一个容器。
  • required – 可选参数是否可以省略 (仅针对可选参数)。
  • help – 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
  • metavar – 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • dest – 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

argparse示例

示例 1 代码如下:

代码语言:javascript复制
import argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="annotated data set for aligned")
    parser.add_argument('-r1', '--src-data-root', dest='data_root1', default='/mnt/dms_data/Data_All/custom_alarm_smokeall_20190505/json/v20190610', type=str, metavar='STRING', help='src data path')
    parser.add_argument('-r2', '--dst-data-root', dest='data_root2', default='/mnt/dms_data/Data_All/custom_alarm_smokeall_20190505/json/v20190505', type=str, metavar='STRING', help='tag data path')
    args = parser.parse_args()
    data_root1 = args.data_root1
    data_root2 = args.data_root2
    print('data_root1 path is %s' % data_root1)  # data_root1 path is /mnt/dms_data/Data_All/custom_alarm_smokeall_20190505/json/v20190610

输出如下:

data_root1 path is /mnt/dms_data/Data_All/custom_alarm_smokeall_20190505/json/v20190610

新建 foler_size.py,实现计算指定目录的大小,并输入以下代码。

代码语言:javascript复制
# Description   : This will scan the current directory and all subdirectories and display the size.

import os
import sys  # Load the library module and the sys module for the argument vector'''
import argparse

# try:
#     directory = sys.argv[1]  # Set the variable directory to be the argument supplied by user.
# except IndexError:
#     sys.exit("Must provide an argument.")

class directory
def get_folder_size(folder_path):
    dir_size = 0  # Set the size to 0
    fsizedicr = {'Bytes': 1,
                'Kilobytes': float(1) / 1024,
                'Megabytes': float(1) / (1024 * 1024),
                'Gigabytes': float(1) / (1024 * 1024 * 1024)}
    # Walk through all the directories. For each iteration, os.walk returns the folders, subfolders and files in the dir.
    for (path, dirs, files) in os.walk(folder_path):  
        for file in files:  # Get all the files
            filename = os.path.join(path, file)
            dir_size  = os.path.getsize(filename)  # Add the size of each file in the root dir to get the total size.

    fsizeList = [str(round(fsizedicr[key] * dir_size, 2))   " "   key for key in fsizedicr]  # List of units

    if dir_size == 0:
        print("File Empty")  # Sanity check to eliminate corner-case of empty file.
    else:
        for units in sorted(fsizeList)[::-1]:  # Reverse sort list of units so smallest magnitude units print first.
            print("Folder Size: "   units)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='This will scan the current directory and all subdirectories and display the size.')
    parser.add_argument('--folder_path', type=str, default="C:\Users\zhanghonggao\Documents\image_utils",
                        help='the path of folder,')
    args = parser.parse_args()
    get_folder_size(args.folder_path)

终端中运行:

代码语言:javascript复制
python folder_size.py --folder_path "C:UserszhanghonggaoDocumentsimage_utils"。

输出如下:

Folder Size: 43652259 Bytes Folder Size: 42629.16 Kilobytes Folder Size: 41.63 Megabytes Folder Size: 0.04 Gigabytes

参考资料

My Python Examples

0 人点赞