在编写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)