使用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)

原创文章,作者:FLGFV,如若转载,请注明出处:https://www.506064.com/n/330626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FLGFVFLGFV
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相关推荐

  • 三星内存条参数用法介绍

    本文将详细解释三星内存条上面的各种参数,让你更好地了解内存条并选择适合自己的一款。 一、容量大小 容量大小是内存条最基本的参数,一般以GB为单位表示,常见的有2GB、4GB、8GB…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Spring Boot中发GET请求参数的处理

    本文将详细介绍如何在Spring Boot中处理GET请求参数,并给出完整的代码示例。 一、Spring Boot的GET请求参数基础 在Spring Boot中,处理GET请求参…

    编程 2025-04-29
  • Python input参数变量用法介绍

    本文将从多个方面对Python input括号里参数变量进行阐述与详解,并提供相应的代码示例。 一、基本介绍 Python input()函数用于获取用户输入。当程序运行到inpu…

    编程 2025-04-29
  • Hibernate日志打印sql参数

    本文将从多个方面介绍如何在Hibernate中打印SQL参数。Hibernate作为一种ORM框架,可以通过打印SQL参数方便开发者调试和优化Hibernate应用。 一、通过配置…

    编程 2025-04-29
  • Python Class括号中的参数用法介绍

    本文将对Python中类的括号中的参数进行详细解析,以帮助初学者熟悉和掌握类的创建以及参数设置。 一、Class的基本定义 在Python中,通过使用关键字class来定义类。类包…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29
  • 光模块异常,SFP未认证(entityphysicalindex=6743835)——解决方案和

    如果您遇到类似optical module exception, sfp is not certified. (entityphysicalindex=6743835)的问题,那么…

    编程 2025-04-29
  • 全能编程开发工程师必知——DTD、XML、XSD以及DTD参数实体

    本文将从大体介绍DTD、XML以及XSD三大知识点,同时深入探究DTD参数实体的作用及实际应用场景。 一、DTD介绍 DTD是文档类型定义(Document Type Defini…

    编程 2025-04-29
  • Python模块下载与安装指南

    如果想要扩展Python的功能,可以使用Python模块来实现。但是,在使用之前,需要先下载并安装对应的模块。本文将从以下多个方面对Python模块下载与安装进行详细的阐述,包括使…

    编程 2025-04-29

发表回复

登录后才能评论