使用argparse编写ls命令
使用argparse模块接收参数的情况在python脚本中非常常用,以下代码部分实现了ls命令。
import argparse
from pathlib import Path
import datetime
#获得参数解析器parser
parser = argparse.ArgumentParser(prog='ls', add_help=False, description='list directory files')
#添加参数
parser.add_argument('path', nargs='*', default='.', help='give a path to list,default is current dir.')
parser.add_argument('-l', dest='detail', action='store_true', help='print more info.')
parser.add_argument('-h', dest='humanreadable', action='store_true', help='print with humanreadable.')
parser.add_argument('-a', '--all', action='store_true', dest='all',
help="In directories, do not ignore file names that start with '.'.")
def human_readable(size: int):
units = ' KMG'
depth = 0
while size > 1000 and depth < len(units) - 1: # 条件确保units不会超界
size //= 1000
depth += 1
return "{}{}".format(size, units[depth])
def listfiles(path, all=False, detail=False, humanreadable=False):
import stat
for paths in tuple(path):
p = Path(paths) # path参数中nargs为?时返回字符串,为*时返回列表
for f in p.iterdir():
if not all and f.name.startswith('.'): # 不显示隐藏文件
continue
if not detail: # 只显示文件名
yield f.name
# yield from (f.name for f in p.iterdir() if all or not f.name.startswith('.'))
else:
st = f.stat()
mode = stat.filemode(st.st_mode)
mtime = datetime.datetime.fromtimestamp(st.st_mtime).strftime('%Y/%M/%D-%H:%M:%S')
size = st.st_size if not humanreadable else human_readable(st.st_size)
yield "{}\t{}\t{}\t{}\t{}\t{}\t{}".format(mode, st.st_nlink, st.st_uid, st.st_gid, size, mtime, f.name)
#当前模块执行时从此处作为入口开始执行,被当作模块调用时if后面语句不执行
if __name__ == '__main__':
args = parser.parse_args()
print(args)
parser.print_help()
files = listfiles(args.path, args.all, args.detail, args.humanreadable)
print(*files, sep='\n')
参数解析器配置
- prog - 程序的名字(默认:sys.argv[0])
- usage - 描述程序用法的字符串(默认:从解析器的参数生成)
- description - 参数帮助信息之前的文本(默认:空)
- epilog - 参数帮助信息之后的文本(默认:空)
- parents - ArgumentParser 对象的一个列表,这些对象的参数应该包括进去
- formatter_class - 定制化帮助信息的类
- prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
- fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
- argument_default - 参数的全局默认值(默认:None)
- add_help - 给解析器添加-h/–help 选项(默认:True)
添加参数配置
参数在parser.parse_args()执行前不会生效
- name or flags - 选项字符串的名字或者列表,例如foo 或者-f, --foo。
- action - 在命令行遇到该参数时采取的基本动作类型,默认为store,其它动作如下:
store,保存参数的值,如-foo 1,则namespace中foo='1'
store_true/store_false,设定参数默认布尔值,出现该参数则默认为True或False
store_const,其后需要跟上const=值,为参数指定具体值
append,保存一个列表,并将每个参数值附加在列表的后面。这对于允许指定多次的选项很有帮助,如下:parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
append_const,保存一个列表,并将const关键字参数指出的值附加在列表的后面。(注意const关键字参数默认是None。)'append_const' 动作在多个参数需要保存常量到相同的列表时特别有用。例如:
parser = argparse.ArgumentParser()
parser.add_argument('--str', dest='types', action='append_const', const=str)
parser.add_argument('--int', dest='types', action='append_const', const=int)
parser.parse_args('--str --int'.split())
Namespace(types=[<type 'str'>, <type 'int'>])
count,计算关键字参数出现的次数。例如,这可用于增加详细的级别:
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='count')
parser.parse_args('-vvv'.split())
Namespace(verbose=3)
- nargs - 应该读取的命令行参数数目,?表示没有或只有一个参数,*表示可以没有或者多个参数,也可以写数字,如0、1、2。
- const - 某些action和nargs选项要求的常数值。
- default - 如果命令行中没有出现该参数时的默认值。
- type - 命令行参数应该被转换成的类型。
- choices - 参数可允许的值的一个容器。
- required - 该命令行选项是否可以省略(只针对可选参数)。
- help - 参数的简短描述。
- metavar - 参数在帮助信息中的名字。
- dest - 给parse_args()返回的对象要添加的属性名称。

浙公网安备 33010602011771号