argparse:Python命令行传参
诸神缄默不语-个人CSDN博文目录
argparse模块(Python官方文档:argparse — 命令行选项、参数和子命令解析器 — Python 3.10.3 文档),可以用来在用命令行运行Python脚本时直接传参。
本文将首先给出直接可以套用的代码格式,然后在此基础上进行更多内容的介绍。
本文目前仅对argparse包的必要功能进行简要介绍,对其更深层次的应用可能会在后期继续更新。
argparse是Python自带的模块。
通过 import argparse
导入包。
一个简单的应用实例:使用argparse传入参数section_id和gpu_id,并获取两个参数(其中gpu_id直接转为torch.device1)
parser = argparse.ArgumentParser()
#创建解析器
#ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。parser.add_argument("--section_id",default='1',type=str)
parser.add_argument("--gpu_id",default='0',type=str)
#添加参数。后文会对各入参有详细介绍args = parser.parse_args()
#解析参数arg_dict=args.__dict__ #将arg_dict转换为dict格式section_id=arg_dict['section_id']
device = torch.device("cuda:"+arg_dict['gpu_id'] if torch.cuda.is_available() else "cpu")
在命令行运行如下语句即可:python example.py --section_id 2 --gpu_id 1
(example.py为Python脚本,参数后面即为所需传入的值)
注意,如果使用anaconda作为环境管理器,如果想直接使用python命令,需要使terminal处在虚拟环境下;否则就要用Python解释器的路径代替python命令。
以下示例及整体内容架构参考自官方文档:
示例prog.py(获取一个列表,并计算其总和或最大值):
import argparseparser = argparse.ArgumentParser(description='Process some integers.')
#description是在参数帮助文档之前显示的文本parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',const=sum, default=max,help='sum the integers (default: find the max)')
#integers 属性将是一个包含一个或多个整数的列表
#accumulate 属性当命令行中指定了 --sum 参数时将是 sum() 函数,否则则是 max() 函数。args = parser.parse_args()
print(args.accumulate(args.integers))
在命令行运行 python prog.py -h
,得到提示信息:
usage: prog.py [-h] [--sum] N [N ...]Process some integers.positional arguments:N an integer for the accumulatoroptions:-h, --help show this help message and exit--sum sum the integers (default: find the max)
计算最大值的示例:python prog.py 1 2 3 4
求和的示例:python prog.py 1 2 3 4 --sum
传入无效参数并报错的示例:python prog.py a b c
报错信息:
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'
add_argument() 方法(以下只列举一部分入参):
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
- name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
前面带-
或--
的就是optional argument,否则就是positional argument(在命令行中必须传入)。第一个传入的参数可以是一系列flags,也可以是单个argument name。
创建optional argument举例:parser.add_argument('-f', '--foo')
(这是一种缩写形式,可以直接用-f
或--foo
传入参数)
创建positional argument举例:parser.add_argument('bar')
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
- action - 当参数在命令行中出现时使用的动作基本类型。
- 默认值 ‘store’:存储参数值
- ‘store_const’:存储const keyword argument指定的值。
- ‘store_true’:用参数传递布尔值。示例用法:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-a",action="store_true")
args = parser.parse_args()
print(type(args.a))
print(args.a)
不传入参数的输出:
<class 'bool'>
False
-a
的输出:
<class 'bool'>
True
- nargs - 单个action关联几个参数。
- ‘*’:整合所有参数为一个list
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
2. ‘+’:与 ‘*’ 类似,但是如果没有传入至少一个参数就会报error。
>>> parser = argparse.ArgumentParser(prog='PROG')
#prog入参是程序名称,默认值为os.path.basename(sys.argv[0])
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
- const - 被一些 action 和 nargs 选择所需求的常数。如果入参action='store_const’或’append_const’会将该值与某一参数值加起来,且该值必须被赋值。默认值为None
- default - 默认值,当参数未在命令行中出现并且也不存在于命名空间对象时所使用的值。
optional argument在option name在命令行中未出现时使用:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
如果目标namespace已经有attribute set了,就不会用:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
如果default值是字符串,parser就会跟命令行一样传参,比如自动根据type值进行转换;否则就使用原object:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
- type - 命令行参数应当被转换成的类型。
可以是任何一个callable、入参为单一str的函数,如float
、int
、ascii
、ord
、open
、argparse.FileType('w', encoding='latin-1')
、pathlib.Path
,也可以是用户自定义的函数。
只能返回ArgumentTypeError、TypeError或ValueError。
不建议使用bool
,因为它仅会置空字符串为False,非空字符串为True。
(需要注意的是,如果直接不输入参数或者以空格作为参数,会报错error: argument --argument_name: expected one argument
;如果输入""
或''
为参数,才会转换为False。直接写None也不会(因为直接识别的是字符串'None'
))
只建议做简单处理。有些问题是报错信息太复杂。FileType
的问题是不会自动close文件。 - help - 一个对此参数作用的简单描述。
在命令行中通过-h或-help参数查看。 - metavar - 在usage messages中显示的参数名。
在ArgumentParser生成的help信息中需要区别各项参数,默认用dest值作为object名。positional argument actions直接用dest值,optional argument actions大写dest值,metavar则是可选名。metavar仅改变展示时的名字,属性名仍然是dest值。不同取值的nargs可能使metavar多次被使用。
简单示例:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo YYY] XXXpositional arguments:XXXoptions:-h, --help show this help message and exit--foo YYY
用元组传入多个metavar的实例:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]options:-h, --help show this help message and exit-x X X--foo bar baz
- dest -
parse_args()
返回对象的属性名。
默认值:
positional argument actions就是add_argument()
的第一个入参。
示例:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
optional argument actions是从option strings中推理得出的:从第一个开始挑一个可以开头有--
的option string然后去掉--
,如果没有就换成-
。然后将option string中间的-
全部改成_
示例:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
指定dest入参值:
示例:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
其他正文及尾注未提及的参考资料:
- add_argument函数的dest参数
对torch.device的解释可参考我之前撰写的博文PyTorch Python API详解大全(持续更新ing…)_诸神缄默不语的博客-CSDN博客 ↩︎
argparse:Python命令行传参相关推荐
- Python 命令行传参
Python 命令行传参 说到 python 命令行传参,可能大部分人的第一反应就是用 argparse.的确,argparse 在我们需要指定多个预设的参数(如深度学习中指定模型的超参数等)时,是非 ...
- matlab读取txt数据绘图(python命令行传参)
(1)命令行实现高斯分布 一:综述 Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Jav ...
- python3输入参数_python3 十一、命令行传参
估计有很多小伙伴在linux系统上或win的doc中遇到没有UI页面的程序,只能通过命令行输入参数的形式去运行 那么python是怎么实现的呢? 熟悉python的小伙伴都知道python有个原生库 ...
- shell脚本的命令行传参
在Linux环境下开发C程序,若想要可选择性的给程序传递外部参数,最后是以启动脚本的形式间接进行传递,这样对于命令行的参数解析工作将集中到shell脚本中,大大增加C代码的可移植性. sh ...
- Linux C程序命令行传参
在命令行环境下,执行已编译的程序时,将命令行参数以同一行的附加参数的形式传入到要执行的程序中.C编译器允许main()函数没有参数,或者有两个参数(也有可能更多,是对标准的扩展).一般形式为" ...
- Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>
什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...
- pytest命令行传参
前言 命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行"pytest --html=report.html",这里面的"--html=report ...
- python使用argparse模块实现在终端命令行传参
直接上代码 import argparse # 定义终端要传送的参数 parser = argparse.ArgumentParser(description="A description ...
- Day13-Java方法详解,方法的定义、重载,命令行传参,可变参数与递归
Java方法详解 什么是方法? Java的方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法再程序中被创建,在其他地方被引用 [方法原子性]一个方 ...
最新文章
- Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)
- asp.net mvc Post上传文件大小限制 (转载)
- 20170102-文件处理
- 【渝粤教育】电大中专新媒体营销实务 (11)作业 题库
- uboot 的 bootcmd 和bootargs参数详解
- java中数组的定义
- 机器学习和传统编程有什么区别?✅
- 第九十八节,JavaScript语法、关键保留字及变量
- mysql表锁ix_S、X、IS、IX数据库锁机制 很详细的教程,简单易懂
- plc中PROFIBUS通信处理器介绍
- 局域网访问提示无法访问检查拼写_win10无法访问共享提示请检查名称的拼写怎么办...
- 泊松分布的期望和方差
- 共阳极数码管显示0~9_《显示器件应用分析精粹》之(3)数码管静态显示
- 三种网络模型(OSI七层参考模型、TCP/IP参考模型、五层参模型)
- 中国驾照在美国各州开车的规定
- ZIP文件夹解压小程序
- C++人工智能相关书籍
- Java面试--堆和栈的概念和区别
- Python3,10行代码,制作艺术签名,从此走上人生巅峰。
- java 之JNLP