Argparseモジュールの使用:ls機能の実現

12228 ワード

ArgparseモジュールはPythonにおけるコマンドラインパラメータ解析のためのモジュールである以下のコードはls機能の実現である
import argparse
import stat
from pathlib import Path
from datetime import datetime

#         
parser = argparse.ArgumentParser(
    prog = 'ls',
    description = 'List information about the FILEs',
    add_help = False
)

#    
parser.add_argument('path', nargs='?', default='.',
                    help='filepath')
                    #    ,?      ,   ,    
parser.add_argument('-l', dest='long', action='store_true',
                    help='use a long listing format')
parser.add_argument('-a', '--all', action='store_true',
                    help='do not ignore entries starting with .')
parser.add_argument('-h', '--human-readable', action='store_true',
                    help='with -l, print sizes in human readable format')

def listdir(path, all=False, detail=False, human=False):
    def _gethuman(size:int):
        units = 'KMGTP'
        depth = 0
        while size >= 10:
            size = size // 1000
            depth += 1
        return '{}{}'.format(size, units[depth])

    def _listdir(path, all=False, detail=False, human=False):
    '''      '''
        p = Path(path)
        for i in p.iterdir():
            if not all and i.name.startswith('.'):
                continue
            if not detail:
                yield (i.name,)
            else:
                st = i.stat()
                mode = stat.filemode(st.st_mode)
                atime = datetime.fromtimestamp(st.st_atime).strftime('%Y-%m-%d %H:%M:%S')
                size = str(st.st_size) if not human else _gethuman(st.st_size)
                yield (mode, st.st_nlink, st.st_uid, st.st_gid, size, atime, i.name)
	#  
    yield from sorted(_listdir(path, all, detail, human), key=lambda x: x[len(x)-1])

if __name__ == '__main__':
    args = parser.parse_args() #    ,        
    print(args)
    parser.print_help()
    files = listdir(args.path, args.all, args.long, args.human_readable)
    print(list(files))
    

テスト:python ***.py -lah以上のコードのまとめ:
  • parser=ArgumentParser()オブジェクト
  • を作成する
  • パラメータadd_を追加argument( )
  • カスタム機能関数func()
  • args = parser.parse_args( )
  • 呼び出し関数func(args)