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()
方法定义了如何解析命令行参数:
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 自定义参数解析;
- store_const,表示赋值为 const 的相反值,比如
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