Python的命令行参数实例详解

目录
  • 0.命令行参数
  • 1.sys.argv
  • 2.getopt
    • 2.1getopt.getopt方法
    • 2.2Exceptiongetopt.GetoptError
  • 3.argparse
  • 总结

0. 命令行参数

通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚本的参数。例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件。

命令行参数是参数化程序执行的一种常见且简单的方法,下面主要介绍三种常见的获取和解析命令行参数的方法。

1. sys.argv

为了处理命令行参数,Python 中内置了 sys.argv 模块,通过模块中的 sys.argv 就可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表 (list)。当程序执行时,Python 从命令行获取所有值并将它们存储在 sys.argv 列表中。列表的第一个元素 sys.argv[0] 是脚本的完整路径(或脚本名称——取决于具体操作系统)。列表的第二个元素是脚本的第一个命令行参数,即 sys.argv[1],依此类推。这可以通过下图中清晰的看出,其中 script_1.py 脚本使用两个参数执行:

接下来,让我们看看 sys.argv 是如何工作的,首先编写 scripy_1.py 脚本:

import sys
print("正在运行的脚本名称: '{}'".format(sys.argv[0]))
print("脚本的参数数量: '{}'".format(len(sys.argv)))
print("脚本的参数: '{}'".format(str(sys.argv)))

如果我们不使用任何参数执行这个脚本:

python script_1.py

将会看到如下信息:

正在运行的脚本名称: 'script_1.py'
脚本的参数数量: '1'
脚本的参数: '['script_1.py']'

如果我们使用多个参数执行此脚本:

python script_1.py OpenCV -i test.png

将得到以下信息:

正在运行的脚本名称: 'script_1.py'
脚本的参数数量: '4'
脚本的参数: '['script_1.py', 'OpenCV', '-i', 'test.png']'

如上所示,列表的第一个元素 script_1.py (sys.argv[0]) 是脚本名称。列表的第二个元素 (sys.argv[1]) OpenCV 是脚本的第一个参数。但同时也可以看到,sys.argv 将命令行选项 -i 也识别为参数,这样并不能方便的满足我们的需求,因此引入 getopt 模块来识别命令行选项。

2. getopt

getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使得程序的参数更加灵活,其支持短选项模式(-)和长选项模式(–)。
该模块提供了两个方法及一个异常处理来解析命令行参数。

2.1 getopt.getopt 方法

getopt.getopt 方法用于解析命令行参数列表,其语法格式如下:

getopt.getopt(args, options[, long_options])

方法参数说明如下表所示:

参数 说明
args 要解析的命令行参数列表,一般是sys.argv[1:],需要过滤掉脚本名(sys.argv[0])
options 以字符串的格式定义,options 后的冒号 “:” 表示如果设置该选项,必须有附加的参数,否则就不附加参数
long_options 以列表的格式定义,long_options 后的等号 “=” 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数

该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 - 或 – 的参数。
下面编写 script_2.py 脚本进行演示:

import sys
import getopt

def main(argv):
    input_file = ""
    output_file = ""
    # "hi:o:": 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数
    # ["help", "input_file=", "output_file="]: 长格式分析串列表, help后面没有等号, 表示后面不带参数; input_file和output_file后面带冒号, 表示后面带参数
    # 返回值包括 `opts` 和 `args`, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: ('-i', 'test.png');
    # args是个列表,其中的元素是那些不含'-'或'--'的参数
    opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print('script_2.py -i <input_file> -o <output_file>')
            print('or: test_arg.py --input_file=<input_file> --output_file=<output_file>')
            sys.exit()
        elif opt in ("-i", "--input_file"):
            input_file = arg
        elif opt in ("-o", "--output_file"):
            output_file = arg
    print('输入文件为:', input_file)
    print('输出文件为:', output_file)

    # 打印不含'-'或'--'的参数
    for i in range(0, len(args)):
        print('不含'-'或'--'的参数 %s 为:%s' % (i + 1, args[i]))

if __name__ == "__main__":
    main(sys.argv)

使用带有命令行选项的命令执行此脚本,以下两种方式是等价的:

# 方式1
python scripy_1.py -i test.png -o output.png OpenCV
# 方式2
python scripy_1.py --input_file test.png --output_file output.png OpenCV

输出得到以下信息:

输入文件为: test.png
输出文件为: output.png
不含'-'或'--'的参数 1 为:OpenCV

2.2 Exception getopt.GetoptError

在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。
在上述代码中添加异常处理,检查此错误信息:

# ...
def main(argv):
    input_file = ""
    output_file = ""
    try:
        opts, args = getopt.getopt(argv[1:], "hi:o", ["help", "input_file=", "output_file="])
    except getopt.GetoptError as e:
        print(e.msg)
        print(e.opt)
        sys.exit(2)
# ...

使用错误的格式选项传递参数执行脚本:

python scripy_1.py -f

输出以下错误信息:

option -f not recognized
f

3. argparse

当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后, argparse 将这些参数解析为 sys.argv。此外,argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。

为了介绍此模块,编写 script_3.py,如下所示:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

不带参数运行此脚本不会向 stdout 显示任何内容。但是,如果使用 --help 或 -h 选项,将得到脚本的使用信息提示:

usage: scripy_3.py [-h]
optional arguments:
-h, --help show this help message and exit

指定其他参数会导致错误,例如使用如下命令:

scripy_3.py -i

则会报导致错误:

usage: scripy_3.py [-h]
argparse_minimal.py: error: unrecognized arguments: -i

由于未定义参数,因此不允许其他参数,接下来就添加一个参数,编写 script_4.py 脚本:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_argument", help="this is the string text in connection with first_argument")
args = parser.parse_args()
print(args.first_argument)

这里添加了 add_argument() 方法。此方法用于指定程序将接受哪些命令行选项,此处添加了 first_argument 参数。此外, argparse 模块存储所有参数,将其名称与每个添加参数的名称相匹配——在此处为 first_argument 。为了获得参数值,需要使用 args.first_argument。

如果此脚本以下示方法执行,则输出为 10:

python scripy_4.py 10

但如果脚本在没有参数的情况下执行,则将输出以下信息:

usage: scripy_4.py [-h] first_argument
scripy_4.py: error: the following arguments are required: first_argument

最后,如果我们使用 -h 选项执行脚本,输出将如下所示:

usage: scripy_4.py [-h] first_argument

positional arguments:
  first_argument  this is the string text in connection with first_argument

optional arguments:
  -h, --help      show this help message and exit

默认情况下,argparse 将提供的选项视为字符串。因此,如果参数不是字符串,则应使用 type 选项。使用 script_5.py 脚本,其中添加了两个参数,这两个参数是 int 类型:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("first_number", help="first number to be added", type=int)
parser.add_argument("second_number", help="second number to be added", type=int)
args = parser.parse_args()
print("args: '{}'".format(args))
print("the sum is: '{}'".format(args.first_number + args.second_number))
args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

在前面的示例中,通过调用 vars() 函数将参数存储在字典中:

args_dict = vars(parser.parse_args())
print("args_dict dictionary: '{}'".format(args_dict))
print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))

如果不带参数执行脚本:

python script_5.py

则输出如下:

usage: scripy_5.py [-h] first_number second_number
scripy_5.py: error: the following arguments are required: first_number, second_number

此外,如果我们使用 -h 选项执行脚本:

python script_5.py --help

输出将如下所示:

usage: scripy_1.py [-h] first_number second_number

positional arguments:
  first_number   first number to be added
  second_number  second number to be added

optional arguments:
  -h, --help     show this help message and exit

如果此脚本以如下方式执行:

python script_5.py 123 456

则输出如下:

args: 'Namespace(first_number=123, second_number=456)'
the sum is: '579'
args_dict dictionary: '{'first_number': 123, 'second_number': 456}'
first argument from the dictionary: '123'

更多 argparse 的高级介绍可以在官方文档中看到,其中包括了大量示例

总结

到此这篇关于Python命令行参数详解的文章就介绍到这了,更多相关Python命令行参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python命令行参数解析模块optparse使用实例

    示例 复制代码 代码如下: from optparse import OptionParser [...] def main():     usage = "usage: %prog [options] arg"     parser = OptionParser(usage)     parser.add_option("-f", "--file", dest="filename",                     

  • python实现读取命令行参数的方法

    本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sys 参数个数:len(sys.argv) 脚本名:    sys.argv[0] 参数1:     sys.argv[1] 参数2:     sys.argv[2] test.py: import sys print "脚本名:", sys.argv[0] for i in rang

  • python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv -- 命令行执行:python test_命令行传参.py 1,2,3 1000 # test_命令行传参.py import sys def para_input(): print(len(sys.argv)) #

  • python命令行参数sys.argv使用示例

    复制代码 代码如下: #diff.py#!/bin/env python import sys if len(sys.argv) <> 3:    print "Usage: " + sys.argv[0] + "file1 file2"    sys.exit(-1) file1 = sys.argv[1]file2 = sys.argv[2] list1 = {}for line in open(file1):    list1[line.split

  • Python 获得命令行参数的方法(推荐)

    本篇将介绍python中sys, getopt模块处理命令行参数 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sys 参数个数:len(sys.argv) 脚本名:    sys.argv[0] 参数1:     sys.argv[1] 参数2:     sys.argv[2] test.py import sys print "脚本名:", sys.argv[0] for i in range(1, len(sy

  • Python 命令行参数sys.argv

    Python代码: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import os, sysos.system(sys.argv[1])带参数执行 python xxx.py speos.system 是用来执行命令行的.因此该程序会接收到第一个参数spe,然后在命令行里执行spe,这样,spe(Python IDE)就打开了.

  • python 获取命令行参数 函数

    import sys print sys.argv print len(sys.argv) #参数个数 print sys.argv[1] #第一个参数 print sys.argv[2]

  • Python的命令行参数实例详解

    目录 0.命令行参数 1.sys.argv 2.getopt 2.1getopt.getopt方法 2.2Exceptiongetopt.GetoptError 3.argparse 总结 0. 命令行参数 通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚本的参数.例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件. 命令行参数是参数化程序执行的一种常见

  • Python argparse模块实现解析命令行参数方法详解

    argparse是Python的一个标准模块,用于解析命令行参数,即解析sys.argv中定义的参数.实现在:传送门 argparse模块还会自动生成帮助和使用信息,即在最后加-h或--help.当用户输入的参数无效时,会触发error,并给出出错原因. python test_argparse.py -h python test_argparse.py --help 使用argparse的步骤: 1.创建解析器:argparse.ArgumentParser(),ArgumentParser是

  • python Pandas库read_excel()参数实例详解

    目录 1.read_excel函数原型 2.参数使用举例 2.1. io和sheet_name参数 2.2. header参数 2.3. skipfooter参数 2.5. parse_dates参数 2.6. converters参数 2.7. na_values参数 2.8. usecols参数 总结 Pandas read_excel()参数使用详解 1.read_excel函数原型 def read_excel(io, sheet_name=0, header=0, names=None

  • linux shell命令行参数用法详解

    习惯使用linux命令行来管理linux系统,例如: 复制代码 代码如下: $ date 二 11 23 01:34:58 CST 1999  $ 用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统.命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式如下:  复制代码 代码如下: $ Command Option Arguments 一,选项和参数 选项是包括一个或多个字母的代码,它前面有一个减号(减

  • Python命令行解析模块详解

    本文研究的主要是Python命令行解析模块的相关内容,具体如下. Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块.下面就解读下这两种解析器. getopt模块 这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:].它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数).这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError). 这里重

  • python open函数中newline参数实例详解

    目录 问题的由来 具体实例 总结 问题的由来 我在读pythoncsv模块文档 看到了这样一句话 如果 csvfile 是文件对象,则打开它时应使用 newline=‘’.其备注:如果没有指定 newline=‘’,则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入.由于 csv 模块会执行自己的(通用)换行符处理,因此指定 newline=‘’ 应该总是安全的. 我就在思考open函数中的newline参数的作用,因为自己之前在使用open函数时

  • Python处理命令行参数模块optpars用法实例分析

    本文实例讲述了Python处理命令行参数模块optpars用法.分享给大家供大家参考,具体如下: optpars是python中用来处理命令行参数的模块,可以自动生成程序的帮助信息,功能强大,易于使用,可以方便的生成标准的,符合Unix/Posix 规范的命令行说明. 使用 add_option() 来加入选项,使用 parse_args() 来解析命令行. add_option()中参数 第一个参数表示option的缩写,以单个中划线引导,例如-f.-d,只能用单个字母,可以使用大写; 第二个

  • Python探索之URL Dispatcher实例详解

    URL dispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中. 有了这个base,我们先抛出几个问题,提前思考一下: 这个映射定义在哪里?当映射很多时,如果有效的组织? URL中的参数怎么获取,怎么传给view方法? 如何在view或者是template中反解出UR

随机推荐