zoukankan      html  css  js  c++  java
  • python argparse 模块基本使用

    记录总结 python argparse 模块的基本使用

    1. 说明

    argparse 模块是python 用于解析命令行参数和选项的标准模块。
    程序定义它需要的参数,然后 argparse 模块将弄清如何从 sys.argv 解析出那些参数。 
    argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
    

    2. 使用流程

    使用argparse 模块配置命令行参数时,需要以下几步:

    • import argparse

    • 创建 ArgumentParser() 对象

    • 调用 add_argument() 方法添加参数

    • 使用 parse_args() 解析添加的参数, 返回一个命名空间

    • 参数解析完后,进行后续业务逻辑的处理

    示例:

    import argparse
    import json
    
    args_list = ["keywords", "keywords_from_file", "prefix_keywords", "suffix_keywords",
                 "limit", "format", "color", "color_type", "usage_rights", "size",
                 "exact_size", "aspect_ratio", "type", "time", "time_range", "delay", "url", "single_image",
                 "output_directory", "image_directory", "no_directory", "proxy", "similar_images", "specific_site",
                 "print_urls", "print_size", "print_paths", "metadata", "extract_metadata", "socket_timeout",
                 "thumbnail", "thumbnail_only", "language", "prefix", "chromedriver", "related_images", "safe_search", "no_numbering",
                 "offset", "no_download","save_source","silent_mode","ignore_urls"]
    
    def user_input():
        # 创建 ArgumentParser() 对象
        config = argparse.ArgumentParser()
        # 调用 add_argument() 方法添加参数
        config.add_argument('-cf', '--config_file', help='config file name', default='', type=str, required=False)
        config_file_check = config.parse_known_args()
        object_check = vars(config_file_check[0])
    
        if object_check['config_file'] != '':
            records = []
            json_file = json.load(open(config_file_check[0].config_file))
            for record in range(0,len(json_file['Records'])):
                arguments = {}
                for i in args_list:
                    arguments[i] = None
                for key, value in json_file['Records'][record].items():
                    arguments[key] = value
                records.append(arguments)
            records_count = len(records)
        else:
            # Taking command line arguments from users
            parser = argparse.ArgumentParser()
            parser.add_argument('-k', '--keywords', help='delimited list input', type=str, required=False)
            parser.add_argument('-kf', '--keywords_from_file', help='extract list of keywords from a text file', type=str, required=False)
            parser.add_argument('-sk', '--suffix_keywords', help='comma separated additional words added after to main keyword', type=str, required=False)
            parser.add_argument('-pk', '--prefix_keywords', help='comma separated additional words added before main keyword', type=str, required=False)
            parser.add_argument('-l', '--limit', help='delimited list input', type=str, required=False)
            parser.add_argument('-f', '--format', help='download images with specific format', type=str, required=False,
                                choices=['jpg', 'gif', 'png', 'bmp', 'svg', 'webp', 'ico'])
            parser.add_argument('-u', '--url', help='search with google image URL', type=str, required=False)
            parser.add_argument('-x', '--single_image', help='downloading a single image from URL', type=str, required=False)
            parser.add_argument('-o', '--output_directory', help='download images in a specific main directory', type=str, required=False)
            parser.add_argument('-i', '--image_directory', help='download images in a specific sub-directory', type=str, required=False)
            parser.add_argument('-n', '--no_directory', default=False, help='download images in the main directory but no sub-directory', action="store_true")
            parser.add_argument('-d', '--delay', help='delay in seconds to wait between downloading two images', type=int, required=False)
            parser.add_argument('-co', '--color', help='filter on color', type=str, required=False,
                                choices=['red', 'orange', 'yellow', 'green', 'teal', 'blue', 'purple', 'pink', 'white', 'gray', 'black', 'brown'])
            parser.add_argument('-ct', '--color_type', help='filter on color', type=str, required=False,
                                choices=['full-color', 'black-and-white', 'transparent'])
            parser.add_argument('-r', '--usage_rights', help='usage rights', type=str, required=False,
                                choices=['labeled-for-reuse-with-modifications','labeled-for-reuse','labeled-for-noncommercial-reuse-with-modification','labeled-for-nocommercial-reuse'])
            parser.add_argument('-s', '--size', help='image size', type=str, required=False,
                                choices=['large','medium','icon','>400*300','>640*480','>800*600','>1024*768','>2MP','>4MP','>6MP','>8MP','>10MP','>12MP','>15MP','>20MP','>40MP','>70MP'])
            parser.add_argument('-es', '--exact_size', help='exact image resolution "WIDTH,HEIGHT"', type=str, required=False)
            parser.add_argument('-t', '--type', help='image type', type=str, required=False,
                                choices=['face','photo','clipart','line-drawing','animated'])
            parser.add_argument('-w', '--time', help='image age', type=str, required=False,
                                choices=['past-24-hours','past-7-days','past-month','past-year'])
            parser.add_argument('-wr', '--time_range', help='time range for the age of the image. should be in the format {"time_min":"MM/DD/YYYY","time_max":"MM/DD/YYYY"}', type=str, required=False)
            parser.add_argument('-a', '--aspect_ratio', help='comma separated additional words added to keywords', type=str, required=False,
                                choices=['tall', 'square', 'wide', 'panoramic'])
            parser.add_argument('-si', '--similar_images', help='downloads images very similar to the image URL you provide', type=str, required=False)
            parser.add_argument('-ss', '--specific_site', help='downloads images that are indexed from a specific website', type=str, required=False)
            parser.add_argument('-p', '--print_urls', default=False, help="Print the URLs of the images", action="store_true")
            parser.add_argument('-ps', '--print_size', default=False, help="Print the size of the images on disk", action="store_true")
            parser.add_argument('-pp', '--print_paths', default=False, help="Prints the list of absolute paths of the images",action="store_true")
            parser.add_argument('-m', '--metadata', default=False, help="Print the metadata of the image", action="store_true")
            parser.add_argument('-e', '--extract_metadata', default=False, help="Dumps all the logs into a text file", action="store_true")
            parser.add_argument('-st', '--socket_timeout', default=False, help="Connection timeout waiting for the image to download", type=float)
            parser.add_argument('-th', '--thumbnail', default=False, help="Downloads image thumbnail along with the actual image", action="store_true")
            parser.add_argument('-tho', '--thumbnail_only', default=False, help="Downloads only thumbnail without downloading actual images", action="store_true")
            parser.add_argument('-la', '--language', default=False, help="Defines the language filter. The search results are authomatically returned in that language", type=str, required=False,
                                choices=['Arabic','Chinese (Simplified)','Chinese (Traditional)','Czech','Danish','Dutch','English','Estonian','Finnish','French','German','Greek','Hebrew','Hungarian','Icelandic','Italian','Japanese','Korean','Latvian','Lithuanian','Norwegian','Portuguese','Polish','Romanian','Russian','Spanish','Swedish','Turkish'])
            parser.add_argument('-pr', '--prefix', default=False, help="A word that you would want to prefix in front of each image name", type=str, required=False)
            parser.add_argument('-px', '--proxy', help='specify a proxy address and port', type=str, required=False)
            parser.add_argument('-cd', '--chromedriver', help='specify the path to chromedriver executable in your local machine', type=str, required=False)
            parser.add_argument('-ri', '--related_images', default=False, help="Downloads images that are similar to the keyword provided", action="store_true")
            parser.add_argument('-sa', '--safe_search', default=False, help="Turns on the safe search filter while searching for images", action="store_true")
            parser.add_argument('-nn', '--no_numbering', default=False, help="Allows you to exclude the default numbering of images", action="store_true")
            parser.add_argument('-of', '--offset', help="Where to start in the fetched links", type=str, required=False)
            parser.add_argument('-nd', '--no_download', default=False, help="Prints the URLs of the images and/or thumbnails without downloading them", action="store_true")
            parser.add_argument('-iu', '--ignore_urls', default=False, help="delimited list input of image urls/keywords to ignore", type=str)
            parser.add_argument('-sil', '--silent_mode', default=False, help="Remains silent. Does not print notification messages on the terminal", action="store_true")
            parser.add_argument('-is', '--save_source', help="creates a text file containing a list of downloaded images along with source page url", type=str, required=False)
            # 使用 parse_args() 解析添加的参数
            # 默认的 args 的结果:
            # Namespace(aspect_ratio=None, chromedriver=None, color=None, color_type=None, delay=None, exact_size=None, extract_metadata=False, format=None, ignore_urls=False, image_directory=None, keywords=None, keywords_from_file=None, language=False, limit=None, metadata=False, no_directory=False, no_download=False, no_numbering=False, offset=None, output_directory=None, prefix=False, prefix_keywords=None, print_paths=False, print_size=False, print_urls=False, proxy=None, related_images=False, safe_search=False, save_source=None, silent_mode=False, similar_images=None, single_image=None, size=None, socket_timeout=False, specific_site=None, suffix_keywords=None, thumbnail=False, thumbnail_only=False, time=None, time_range=None, type=None, url=None, usage_rights=None)
            args = parser.parse_args()  # 返回一个命名空间
            arguments = vars(args) # 返回 args 的属性和属性值的字典
            # arguments 的结构:
            # {'image_directory': None, 'print_urls': False, 'usage_rights': None, 'color': None, 'socket_timeout': False, 'time_range': None, 'chromedriver': None, 'prefix': False, 'extract_metadata': False, 'keywords': None, 'no_numbering': False, 'size': None, 'keywords_from_file': None, 'print_paths': False, 'no_download': False, 'delay': None, 'similar_images': None, 'specific_site': None, 'thumbnail_only': False, 'type': None, 'thumbnail': False, 'metadata': False, 'related_images': False, 'format': None, 'silent_mode': False, 'print_size': False, 'color_type': None, 'exact_size': None, 'no_directory': False, 'suffix_keywords': None, 'single_image': None, 'offset': None, 'output_directory': None, 'language': False, 'url': None, 'prefix_keywords': None, 'save_source': None, 'ignore_urls': False, 'safe_search': False, 'limit': None, 'time': None, 'aspect_ratio': None, 'proxy': None}
            records = []
            records.append(arguments)
        return records
    

    3. 参数说明

    add_argument() 函数每个参数解释如下:

    • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
    • action - 命令行遇到参数时的动作,默认值是 store。
    • store_const,表示赋值为const;
    • 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 - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

    4. 位置参数 设置

    以上 描述的是 可选参数的使用,下面描述位置参数的设置,设置了位置参数后,调用脚本时必须要传入对应的值

    import argparse
     
    parser = argparse.ArgumentParser()
    parser.add_argument('a', type=int, help='display an integer param')
    args = parser.parse_args()
     
    print(args.a)
    
    

    5. 再来个简单示例

    #! /usr/bin/env python
    #  -*- coding: UTF-8 -*-
    # @FileName: argparserdemo.py
    # @Project : project
    import argparse
    import time
    import sys
    
    
    def func1(echo_content):
        print "start to invoke function {}".format("func1")
        print "---------------- content: {}".format(echo_content)
        time.sleep(5)
        print "end to invoke function {}".format("func1")
    
    
    def func2(echo_content):
        print "start to invoke function {}".format("func2")
        print "---------------- content: {}".format(echo_content)
        time.sleep(3)
        print "end to invoke function {}".format("func2")
    
    
    def show_version():
        print "current version: 1.0.0"
    
    
    def use_help():
        """
        通过参数解析的方式支持命令行参数
        :return:
        """
        # 创建ArgumentParser 对象
        parser = argparse.ArgumentParser()
        # 调用 add_argument() 方法添加参数
        # 使用 action='store_true' ,使得 -v/--version 可以不用带参数
        parser.add_argument('-v', '--version', help='show current version', action='store_true')
        parser.add_argument('-f1', '--func1', help='invoke func1', type=str, required=False)
        parser.add_argument('-f2', '--func2', help='invoke func2', type=str, required=False)
    
        return parser.parse_args()
    
    
    if __name__ == '__main__':
        help = use_help()
        if help.version:
            show_version()
            sys.exit(1)
        func1_content = help.func1
        func2_content = help.func2
        if func1_content:
            func1(func1_content)
        if func2_content:
            func2(func2_content)
    
    运行示例:
    D:Anaconda2envspython27_virtual_envpython.exe E:/project/demo/argparserdemo/argparserdemo.py -f1 "hello world" --func2 "hello python"
    start to invoke function func1
    ---------------- content: hello world
    end to invoke function func1
    start to invoke function func2
    ---------------- content: hello python
    end to invoke function func2
    

    更多内容,可参考: https://www.jianshu.com/p/fef2d215b91d

    种一棵树最好的时间是十年前,其次是现在!
  • 相关阅读:
    mysql 约束条件介绍
    mysql 约束条件目录
    mysql 日期类型
    mysql float 浮点型
    mysql int 整数类型 解释显示宽度 和 存储宽度
    mysql 整数类型 数值类型 tinyint
    【洛谷P4096】Eden 的博弈树
    【GMOJ6824】英雄联盟
    【GMOJ6826】隔膜
    【POJ 2420】A Star not a Tree?
  • 原文地址:https://www.cnblogs.com/gaozhidao/p/12330028.html
Copyright © 2011-2022 走看看