Python 命令行参数
参考文章:https://zhuanlan.zhihu.com/p/56922793
目标:编写出可执行参数的脚本文件并打包;
1. sys模块方法
使用sys.argv
获取执行参数;
""" 开发终端参数脚本;
"""
import sys
# sys.argv 返回的是一个参数的列表 ['console_learn.py', '自动输入']
print("终端的参数是%s" % sys.argv)
# argv 返回的参数列表第一个元素是 PY 文件名; 如果不想获取到文件名, 可以使用切片的方式去除
print("去除文件名后的参数是%s" % sys.argv[1:])
sys.argv
只提供了比较简单的命令行参数获取的方式,并没有命令行提示。无法做到向Linux命令行一样,可以提供help
帮助;
2. argparse模块
argparse模块可以轻松的编写用户友好的命令行界面。该程序定义了它需要的参数,argparse并将找出如何解析这些参数sys.argv
;该模块还会自动生成帮助和用法消息,并在用户给出程序无效参数是发生异常.
python 内置模块,无需安装直接使用;
parse = argparse.ArgumentParser(
prog='my -program',
usage='%(prog)s [options] useage',
description='my -epilog'
)
print(parse.print_help())
参数解释
- prog: 文件名,默认为
sys.argv[0]
,用来在help
信息描述程序的名称。 - usege:描述程序用途的字符串.
- description:
help
之后显示的提示信息。 - parents:*由
ArgumentParser
对象组成的列表,他们的arguments
选项会被包含到新ArgumentParser
对象中类似于*继承; - formatter_class:
help
信息输出的格式,为了美观 - prefix_chars:参数的前缀,默认为
-
,最好不要修改 - fromfile_prefix_chars:前缀字符放在文件名之前
- add_help:默认为
True
,是否增加-h(-help)
选项;一般都是必须的。设置为False
不在显示-h
- argument_default:默认是(None),设置一个全局选项的缺省值,一般每个选项单独设置,基本没用。
2.1 简单使用
import argparse
parser = argparse.ArgumentParser(description="命令行中传入一个数字")
parser.add_argument("integers", type=str, help="传入的数字")
args = parser.parse_args()
print(args)
# 终端执行与输出
>>> python console_learn.py 5
>>>Namespace(integers='5')
# 帮助文本输出
>>> python console_learn.py -h
usage: console_learn.py [-h] integers
命令行中传入一个数字
positional arguments:
integers 传入的数字
optional arguments:
-h, --help show this help message and exit
操作args
字典(对象)
其实得到的这个结果Namespace(integers='5')
是一种类似于python字典的数据类型。
我们可以使用 arg.参数名
来提取这个参数
import argparse
parser = argparse.ArgumentParser(description="命令行中传入一个数字")
parser.add_argument("integers", type=str, help="传入的数字")
args = parser.parse_args()
# 获取输入的参数;
print(args.integers)
# 终端执行
>>> python console_learn.py 5
5
2.2 add_argument方法
ArgumentParser.add_argument(....)
定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:
- name or flags - 一个命名或者一个选项字符串的列表,例如
foo
或-f, --foo
。 - action - 当参数在命令行中出现时使用的动作基本类型。
- nargs - 命令行参数应当消耗的数目。
- const - 被一些 action 和 nargs 选择所需求的常数。
- default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
- type - 命令行参数应当被转换成的类型。
- choices - 可用的参数的容器。
- required - 此命令行选项是否可省略 (仅选项可用)。
- help - 一个此选项作用的简单描述。
- metavar - 在使用方法消息中使用的参数值示例。
- dest - 被添加到
parse_args()
所返回对象上的属性名。
继续使用上述案例进行操作
2.2.1 获取多个参数
我们将上面的脚本运行的时候传入多个参数;
>>>python console_learn.py 5 6 7 7
# 输出:
usage: console_learn.py [-h] integers
console_learn.py: error: unrecognized arguments: 6 7 7
不能识别 6,7,7;integers这个参数是位置参数,说明第一个数1
是能识别。这里我们需要重新更改代码.
import argparse
# 在add_argument中增加参数 +
parser = argparse.ArgumentParser(description="命令行中传入一个数字")
parser.add_argument("integers", type=str, nargs='+', help="传入的数字")
args = parser.parse_args()
print(args.integers)
>>> python console_learn.py 5 6 7 7
['5', '6', '7', '7']
nrgs是用来说明传入的参数个数,+
表示至少传入一个参数。运行结果如上面显示;
2.2.2 改变数据类型
dd_argument中有type参数可以设置传入参数的数据类型。我们看到代码中有type这个关键词,该关键词可以传入list, str, tuple, set, dict
等。例如我们把上面的type=str
,改成type=in
t,这时候我们就可以进行四则运算。
import argparse
parser = argparse.ArgumentParser(description="命令行中传入一个数字")
parser.add_argument("integers", type=int, nargs='+', help="传入的数字")
args = parser.parse_args()
print(sum(args.integers))
print(args.integers)
# 终端执行与输出
>>>python console_learn.py 5 6 7 7
25
[5, 6, 7, 7]
2.2.3 位置参数
在命令行中传入参数时候,传入的参数的先后顺序不同,运行结果往往会不同,这是因为采用了位置参数,例如
import argparse
parser = argparse.ArgumentParser(description="姓名")
# parser.add_argument("p2", type=str, help="名") 换位置后执行
parser.add_argument("p1", type=str, help="姓") # 按照顺序接收第一个参数的值;
parser.add_argument("p2", type=str, help="名")
args = parser.parse_args()
print(args.p1 + args.p2)
>>> python console_learn.py 张 三
张三
# 换位置后执行
>>>python console_learn.py 张 三
三张
将代码的第五六行换位置重新执行,是按照代码的前后顺序接收的值;
2.2.4 可选参数
为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加--
,例如
import argparse
parser = argparse.ArgumentParser(description="姓名")
parser.add_argument("--family", type=str, help="姓")
parser.add_argument("--name", type=str, help="名")
args = parser.parse_args()
print(args.family + args.name)
>>> python console_learn.py --family 张 --name 三
张三
可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱。
import argparse
parser = argparse.ArgumentParser(description="姓名")
# 个人测试使用 单横杠的时候效果一样;
parser.add_argument("-family", type=str, help="姓")
parser.add_argument("-name", type=str, help="名")
args = parser.parse_args()
print(args.family + args.name)
2.2.5 默认值
add_argument中有一个default参数。有的时候需要对某个参数设置默认值,即如果命令行中没有传入该参数的值,程序使用默认值。如果命令行传入该参数,则程序使用传入的值。具体请看下面的例子
import argparse
parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, default='张',help='姓')
parser.add_argument('--name', type=str, default='三', help='名')
args = parser.parse_args()
#打印姓名
print(args.family+args.name)
在命令行中分别输入 python demo.py
、 python demo.py --family=李
运行结果分别为
>>> python console_learn.py
张三
>>> python console_learn.py -family 李
李三
2.2.6 必须参数
add_argument有一个required参数可以设置该参数是否必需。
注意:required必须在可选参数中使用;通常,argparse
模块会认为 -f
和 --bar
等旗标是指明 可选的 参数
import argparse
parser = argparse.ArgumentParser(description="姓名")
parser.add_argument("-family", type=str, default='张', help="姓")
parser.add_argument("-name", type=str, required=True, default='', help="名")
args = parser.parse_args()
print(args.family + args.name)
# 修改为 False
运行结果
>>> python console_learn.py -family 李
usage: console_learn.py [-h] [-family FAMILY] -name NAME
console_learn.py: error: the following arguments are required: -name
>>> python console_learn.py -family 李 -name 三
李三
2.3.parse_args 方法
ArgumentParser.parse_args(args=None, namespace=None)
将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。之前对add_argument()
的调用决定了哪些对象被创建以及它们如何被赋值。 请参阅add_argument()
的文档了解详情。args - 要解析的字符串列表。 默认值是从sys.argv
获取。namespace - 用于获取属性的对象。 默认值是一个新的空Namespace
对象。
更多信息参考:https://docs.python.org/zh-cn/3/library/argparse.html?highlight=argparse#
3.打包后执行
使用pyinstaller
打包生成相关的exe
文件;
进入终端执行
dist>console_learn.exe -h
usage: console_learn.exe [-h] [-family FAMILY] [-name NAME]
姓名
optional arguments:
-h, --help show this help message and exit
-family FAMILY 姓
-name NAME 名
dist>console_learn.exe -family 上官 -name 婉儿
上官婉儿
标签:argparse,args,help,Python,parser,argument,参数,命令行
From: https://www.cnblogs.com/Blogwj123/p/16916029.html