Python文件在命令行中的操作(argparse模块)

  在深度学习中我们会常常在服务器中跑代码,因此常常会使用到命令行来运行程序。如果直接在命令行中输入python xxxx.py就会执行相应的python程序了,但是如果我们想要改变文件中某些固定参数的数值,我们还得修改.py文件中的具体参数数值然后再使用命令行执行,但是如果运行python程序可以像命令行的一些命令一样,可以输入可选参数(以Liunx系统为例,cd --help 将会出现cd这个命令的一些帮助和可选参数介绍)然后再根据可选参数运行.py文件是不是会更好呢。python中就有argparse模块来实现这样的功能。

  对于argparse模块的介绍主要是三个方面的介绍,ArgumentParser 对象add_argument() 方法parse_args() 方法,他们都具有官方文档,详细的信息可以点击链接取访问到。而本文的介绍主要是简单版使用,有些高阶使用大家可以参看官方文档和其他的博文。

一、argparse模块使用流程

  1、创建解析器

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')

  以上代码创建一个 ArgumentParser 对象(parser)。ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。

  2、添加参数

parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')

  以上代码是在添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项,解释信息“an integer for the accumulator”将会出现在帮助文档中(python xxx.py --help在命令行中调用出文件的帮助文档),以及命令行传入参数的类型定义为int,其他参数在介add_argument()方法的时候再具体讲解。

  3、解析参数

  在完成解析器的创建以及定义好需要接受的参数之后,我们就需要解析我们接收到的参数了。主要方式是通过 ArgumentParser.parse_args()方法得到一个argparse.Namespace对象,而这个对象中不同属性值就是我们通过命令行传去进去的参数具体数值。

  下面写一个小的例子来说明如何完成上面这一套的操作的。

  首先创建一个test.py文件,内容是:

import argparse
parser = argparse.ArgumentParser(description="这是在帮助文档之前显示的内容")  # 第一步创建解析器
parser.add_argument('--name',default="circle_wang", help = "这个参数请输入姓名") #第二步输入我需要的在命令行中接受的参数
parser.add_argument('--age', default=0, help = "这个参数请输入年龄")   # 继续添加我需要在命令行中接受的参数
args = parser.parse_args()          # 第四步获取解析参数的对象Namespace

# 以下的输出时是为了让大家更好的看到具体的返回结果
print('args的类型',type(args))         print('name参数解析的结果:',type(args.name), '值:',args.name) print('age参数解析的结果:',type(args.age), '值:', args.age)

  接下来在命令行中执行程序

python test.py --age=25 --name=大帅哥  # 我们把age=25,name=帅哥传入进程序
args的类型 <class 'argparse.Namespace'>
name参数解析的结果: <class 'str'> 值: 大帅哥
age参数解析的结果: <class 'str'> 值: 25

   可以看到,我们从命令行中获取的参数都是以字符串的方式储存在Namespace的对应属性中。我们接下来继续看看如果使用--help来查看帮助文档会有那些效果。

python test.py --help

 

   以上就是我的这个test.py文件的帮助文档,大家对比着看看就可以很清楚的知道我之前代码中那些部分对应着帮助文档的那些部分。大家可以更改示例代码,并在命令行中运行(注意不是调试运行)。

二、ArgumentParser 对象   

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)

  ArgumentParser 对象实例化的时候可以输入的参数很多,其实我们最常用的就是description参数,这个参数输入的是字符串,会显示在帮助文档之前。对于其他的参数我平常比较少使用大家可以参看官方文档。

  参数说明:

  • prog : 程序的名称(默认:sys.argv[0]) usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
  • description : 在参数帮助文档之前显示的文本(默认值:无)
  • epilog :在参数帮助文档之后显示的文本(默认值:无)
  • parents : 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
  • formatter_class : 用于自定义帮助文档输出格式的类
  • prefix_chars:可选参数的前缀字符集合(默认值:’-’)
  • fromfile_prefix_chars : 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)
  • argument_default :参数的全局默认值(默认值: None)
  • conflict_handler :解决冲突选项的策略(通常是不必要的)
  • add_help :为解析器添加一个 -h/–help 选项(默认值: True)
  • allow_abbrev : 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)

三、add_argument() 方法介绍

  我们得到解析器(ArgumentParser 对象)之后,我们告诉这个解析器我们需要获取那些输入,这些输入需要满足那些条件,比如必须是什么数据类型...每一个参数我们都需要根据这种方式来添加,例如我们之前例子中所显示的那样,我们需要获取两个参数,一个叫name,一个叫age,并且分别给予了他们默认值(如果不给定默认值,在输入的时候缺少这个参数就会报错)

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

  参数说明:

  • name or flags :一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo.
  • action :当参数在命令行中出现时使用的动作基本类型。
  • nargs : 命令行参数应当消耗的数目。具体使用的时候查看对应的中文官方文档
  • const :被一些 action 和 nargs 选择所需求的常数。
  • default : 当参数未在命令行中出现时使用的值。
  • type : 命令行参数应当被转换成的类型。
  • choices : 可用的参数的容器。
  • required : 此命令行选项是否可省略 (仅选项可用)。
  • help : 一个此选项作用的简单描述。
  • metavar : 在使用方法消息中使用的参数值示例。
  • dest : 被添加到 parse_args() 所返回对象上的属性名。

  其中最常用的可选参数是:default,type,help,nargs下面我就在之前的test.py的基础上更改一些参数来说明其使用方法。

  test.py文件为:

import argparse

parser = argparse.ArgumentParser(description="这是在帮助文档之前显示的内容")  
parser.add_argument('name',default="circle_wang", help = "这个参数请输入姓名")  # 如果在定义参数名字的时候不添加‘-’则被认为是位置参数,这个参数的读取会按顺序来读取
parser.add_argument(
'--age', default=0, help = "这个参数请输入年龄",type=int) parser.add_argument('--parents', nargs=2, help = "请输入父亲和母亲的名字,以空格分割")  # 这里nages=N意味着--parents参数后面跟的N个输入会被读取,并整合为一个列表 parser.add_argument('--brothers', nargs='+', help = "请输入兄弟的名字任意长度,以空格分割", default='大哥')  # nages=‘+’意味着在--brothers参数后面跟的所有参数都将被整合成一个列表。 args = parser.parse_args() print('args的类型',type(args)) print('name参数解析的结果:',type(args.name), '值:',args.name) print('age参数解析的结果:',type(args.age), '值:',args.age) print('parents参数解析的结果:',type(args.parents), '值:',args.parents) print('brothers参数解析的结果:',type(args.brothers), '值:',args.brothers)

  下面我们在命令行进行输入试一试:

python test.py 我的名字 --age=12 --brothers 老大 老二 老三 --parents 爸爸 妈妈  # 注意这里的brothers和parents参数不能用=来连接,只能用空格来隔

 

四、parse_args() 方法介绍

   其实这一段没有什么好说的了,因为前面已经一直在使用了,只要注意的是所有的参数如果type没有给定那么里面的属性就是default时的属性,否则就是str,要注意一些情况下的类型转换。

 

 

本文参考网址:

https://blog.csdn.net/The_Time_Runner/article/details/97941409

https://blog.csdn.net/weixin_39533742/article/details/114910227

posted @ 2021-09-10 18:07  Circle_Wang  阅读(789)  评论(0编辑  收藏  举报