您的位置:

使用Python的Sys模块的命令行参数解析功能

在编写Python脚本时,有时候需要从命令行接收参数以便灵活地定制程序的行为。Sys模块是Python自带的一个模块,提供了处理命令行参数的功能,使得程序的命令行输入输出更加方便。

一、sys.argv的基本用法

sys.argv是一个包含命令行参数的列表,其中第一个元素是程序本身的名称。在需要从命令行获取一些参数的时候,可以使用sys.argv[1:]获取所有参数,然后进行处理。

import sys

print("脚本名称:", sys.argv[0])
print("命令行参数:", sys.argv[1:])

运行该脚本,假设命名为test.py,可以输入以下内容:

$ python test.py arg1 arg2 arg3

程序将输出:

脚本名称: test.py
命令行参数: ['arg1', 'arg2', 'arg3']

从上面的代码和运行结果可以看出,使用sys.argv可以轻松获取命令行参数,方便程序的使用和管理。

二、使用argparse解析参数

虽然使用sys.argv获取命令行参数是一种有效的方法,但是当参数的数量很多时,代码的可读性将会降低。同时,需要对参数进行类型转换,对于一些非法参数需要做校验。因此,Python 2.7版本中引入了argparse库,支持解析命令行参数,提高了程序的可读性和可维护性。

下面是一个使用argparse库进行参数解析的示例代码:

import argparse

parser = argparse.ArgumentParser(description='这个程序xxx')

parser.add_argument('-a', '--arg1', type=int, help='第一个参数')
parser.add_argument('-b', '--arg2', type=str, choices=['choice1', 'choice2'], help='第二个参数')
parser.add_argument('-c', '--arg3', action='store_true', help='第三个参数')

args = parser.parse_args()

print('参数arg1:', args.arg1)
print('参数arg2:', args.arg2)
print('参数arg3:', args.arg3)

上面的代码中,parser对象是argparse库的一个核心概念。Parser对象用于描述所有可能的命令行参数,并将它们转换为可用于Python的对象。add_argument()函数用于添加需要解析的参数。-a和--arg1是参数名或选项名,type是表示该参数应该被解析成的类型,help是参数的帮助信息。

在上面的代码中,参数arg1是一个整数类型,并且是必选参数,因此加了type=int参数;参数arg2是一个字符串类型,并且只能从给定选项中选择,因此加了choices=['choice1', 'choice2']参数;参数arg3是一个布尔型,如果在命令行中出现,则设置为True,否则为False,因此加了action='store_true'参数。

以上脚本在命令行中的使用方法如下:

$ python test.py -a 123 -b choice1 -c

脚本将输出:

参数arg1: 123
参数arg2: choice1
参数arg3: True

显然,使用argparse库可以轻松完成复杂参数的解析,代码具有高可读性和可维护性。

三、命令行参数的高级用法

在使用命令行参数时,还可以使用一些高级技巧,从而提高代码的灵活性和扩展性。

1.参数组合

有些参数需要组合使用才能达到预期的效果。例如参数-r和-d表示递归处理目录和删除,组合在一起表示递归删除目录。ARGPARSE提供了一定的支持,但是很麻烦。实际上,可以手动进行参数解析,从而更加自由地组合参数。

import argparse

parser = argparse.ArgumentParser(description='这个程序xxx')

parser.add_argument('--recursive', '-r', action='store_true', default=False, help='递归处理目录')
parser.add_argument('--delete', '-d', action='store_true', default=False, help='删除文件或目录')

args = parser.parse_known_args()

if args[0].recursive and args[0].delete:
    print('递归删除')
elif args[0].delete:
    print('删除')
elif args[0].recursive:
    print('递归')
else:
    print('normal')

在上面的代码中,使用parser.parse_known_args()方法来解析参数。这个方法返回一个元组,第一个元素是一个对象,包含解析后的参数;第二个元素是一个列表,包含剩余的命令行字符串。在本例中,我们只关心第一个元素。这个方法非常方便,因为在不想在参数解析完成前忽略参数和选项。

2.参数文件

如果命令行参数的数量太多,甚至无法放到命令行中,那么我们可以使用参数文件的方式,把所有的参数写到文件中。在运行程序的时候可以将文件名作为参数输入。

import argparse

parser = argparse.ArgumentParser(description='这个程序xxx')

parser.add_argument('--config', '-c', type=str, default='args.conf', help='参数文件名')

args, unknown = parser.parse_known_args()
with open(args.config) as f:
    data = f.read().split()

parser.parse_args(unknown, namespace=args)

print('参数1:', args.arg1)
print('参数2:', args.arg2)
print('参数3:', args.arg3)

上面代码中, -c或--config参数用于传递参数文件的文件名。在参数解析之前打开该文件,读取其中内容,将其转换为一个列表或元组,并加入相应的解析器中。然后进行参数解析。

假设已经有一个参数文件args.conf,其中的内容如下:

2  3  4

那么,通过以下命令即可将args.conf文件中的参数传入脚本中:

$ python test.py -c args.conf

运行结果如下:

参数1: 2
参数2: 3
参数3: 4

总结

本文主要阐述了Python中使用sys模块的命令行参数解析功能,以及使用argparse库完成参数解析的方法。同时,介绍了一些高级的命令行参数用法,包括参数组合和参数文件等。这些技巧可以帮助工程师更好地编写灵活和扩展性高的脚本。完整代码如下:

import argparse
import sys

def main(args):
    print('args:', args)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="使用argparse解析命令行参数")
    parser.add_argument('-i', '--input', metavar='input', type=str, required=True, help='输入文件路径')
    parser.add_argument('-o', '--output', metavar='output', type=str, help='输出文件路径')
    parser.add_argument('-t', '--type', metavar='type', type=str, choices=['csv', 'json'], default='csv', help='输出文件类型')
    parser.add_argument('--encoding', metavar='encoding', type=str, help='输入文件编码方式')
    parser.add_argument('--version', action='version', version='%(prog)s 1.0')
    args = parser.parse_args()

    # 参数解析完成后,调用主函数处理输入和输出
    main(args)