Python标准库Argparse使用简易指南
中文教程链接: Argparse 教程
python官方文档链接: argparse — 命令行选项、参数和子命令解析器
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
概念----参数位置和可选参数
命令行下的演示:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
chenxuqi@chenxuqi-desktop:/mnt/c/Users/chenxuqi/Desktop/新建文件夹/测试$ ls
__pycache__ file_1.py file_2.py file_3.py folder4cxq prog.py
chenxuqi@chenxuqi-desktop:/mnt/c/Users/chenxuqi/Desktop/新建文件夹/测试$ ls folder4cxq
新建文件夹 '新建文件夹 - 副本' '新建文件夹 - 副本 (2)' '新建文件夹 - 副本 (3)' '新建文件夹 - 副本 (4)'
chenxuqi@chenxuqi-desktop:/mnt/c/Users/chenxuqi/Desktop/新建文件夹/测试$ ls -l
total 12
drwxrwxrwx 1 chenxuqi chenxuqi 512 Nov 15 10:30 __pycache__
-rwxrwxrwx 1 chenxuqi chenxuqi 170 Nov 15 20:42 file_1.py
-rwxrwxrwx 1 chenxuqi chenxuqi 91 Nov 15 10:31 file_2.py
-rwxrwxrwx 1 chenxuqi chenxuqi 60 Nov 15 14:10 file_3.py
drwxrwxrwx 1 chenxuqi chenxuqi 512 Nov 15 21:10 folder4cxq
-rwxrwxrwx 1 chenxuqi chenxuqi 9900 Nov 15 20:52 prog.py
chenxuqi@chenxuqi-desktop:/mnt/c/Users/chenxuqi/Desktop/新建文件夹/测试$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE scale sizes by SIZE before printing them; e.g.,
'--block-size=M' prints sizes in units of
1,048,576 bytes; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
-C list entries by columns
--color[=WHEN] colorize the output; WHEN can be 'always' (default
if omitted), 'auto', or 'never'; more info below
-d, --directory list directories themselves, not their contents
-D, --dired generate output designed for Emacs' dired mode
-f do not sort, enable -aU, disable -ls --color
-F, --classify append indicator (one of */=>@|) to entries
--file-type likewise, except do not append '*'
--format=WORD across -x, commas -m, horizontal -x, long -l,
single-column -1, verbose -l, vertical -C
--full-time like -l --time-style=full-iso
-g like -l, but do not list owner
--group-directories-first
group directories before files;
can be augmented with a --sort option, but any
use of --sort=none (-U) disables grouping
-G, --no-group in a long listing, don't print group names
-h, --human-readable with -l and/or -s, print human readable sizes
(e.g., 1K 234M 2G)
--si likewise, but use powers of 1000 not 1024
-H, --dereference-command-line
follow symbolic links listed on the command line
--dereference-command-line-symlink-to-dir
follow each command line symbolic link
that points to a directory
--hide=PATTERN do not list implied entries matching shell PATTERN
(overridden by -a or -A)
--hyperlink[=WHEN] hyperlink file names; WHEN can be 'always'
(default if omitted), 'auto', or 'never'
--indicator-style=WORD append indicator with style WORD to entry names:
none (default), slash (-p),
file-type (--file-type), classify (-F)
-i, --inode print the index number of each file
-I, --ignore=PATTERN do not list implied entries matching shell PATTERN
-k, --kibibytes default to 1024-byte blocks for disk usage
-l use a long listing format
-L, --dereference when showing file information for a symbolic
link, show information for the file the link
references rather than for the link itself
-m fill width with a comma separated list of entries
-n, --numeric-uid-gid like -l, but list numeric user and group IDs
-N, --literal print entry names without quoting
-o like -l, but do not list group information
-p, --indicator-style=slash
append / indicator to directories
-q, --hide-control-chars print ? instead of nongraphic characters
--show-control-chars show nongraphic characters as-is (the default,
unless program is 'ls' and output is a terminal)
-Q, --quote-name enclose entry names in double quotes
--quoting-style=WORD use quoting style WORD for entry names:
literal, locale, shell, shell-always,
shell-escape, shell-escape-always, c, escape
-r, --reverse reverse order while sorting
-R, --recursive list subdirectories recursively
-s, --size print the allocated size of each file, in blocks
-S sort by file size, largest first
--sort=WORD sort by WORD instead of name: none (-U), size (-S),
time (-t), version (-v), extension (-X)
--time=WORD with -l, show time as WORD instead of default
modification time: atime or access or use (-u);
ctime or status (-c); also use specified time
as sort key if --sort=time (newest first)
--time-style=STYLE with -l, show times using style STYLE:
full-iso, long-iso, iso, locale, or +FORMAT;
FORMAT is interpreted like in 'date'; if FORMAT
is FORMAT1<newline>FORMAT2, then FORMAT1 applies
to non-recent files and FORMAT2 to recent files;
if STYLE is prefixed with 'posix-', STYLE
takes effect only outside the POSIX locale
-t sort by modification time, newest first
-T, --tabsize=COLS assume tab stops at each COLS instead of 8
-u with -lt: sort by, and show, access time;
with -l: show access time and sort by name;
otherwise: sort by access time, newest first
-U do not sort; list entries in directory order
-v natural sort of (version) numbers within text
-w, --width=COLS set output width to COLS. 0 means no limit
-x list entries by lines instead of by columns
-X sort alphabetically by entry extension
-Z, --context print any security context of each file
-1 list one file per line. Avoid '\n' with -q or -b
--help display this help and exit
--version output version information and exit
The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Using color to distinguish file types is disabled both by default and
with --color=never. With --color=auto, ls emits color codes only when
standard output is connected to a terminal. The LS_COLORS environment
variable can change the settings. Use the dircolors command to set it.
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report ls translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/ls>
or available locally via: info '(coreutils) ls invocation'
chenxuqi@chenxuqi-desktop:/mnt/c/Users/chenxuqi/Desktop/新建文件夹/测试$
首先了解参数位置和可选参数的概念
ls 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。 在默认情况下他会输出当前文件夹包含的文件和文件夹。 如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。在这个例子里,我们想要查看一个不同的目录,folder4cxq。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的位置。更能体现这个概念的命令如 cp,它最基本的用法是 cp SRC DEST。第一个位置参数指的是你想要复制的位置,第二个位置参数指的是你想要复制到的位置。 现在假设我们想要改变这个程序的行为。在我们的例子中,我们不仅仅只是输出每个文件的文件名,还输出了更多信息。在这个例子中,-l 被称为可选参数。这是一段帮助文档的文字。它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。
基础
我们从一个简单的例子开始,假设之后的代码都保存在文件prog.py下:
例子1:
# 例子1
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
命令行下运行:
在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。
这没有什么用处。
第二行代码开始展现出 argparse 模块的作用。
我们几乎什么也没有做,但已经得到一条很好的帮助信息。
--help 选项,也可缩写为 -h,
是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。
指定任何内容都会导致错误。
即便如此,我们也能直接得到一条有用的用法信息。
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
位置参数介绍
例子2:
# 例子2 控制台输入的回声效果
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
控制台下的操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
usage: prog.py [-h] echo
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 人生苦短我用Python
人生苦短我用Python
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
我们增加了 add_argument() 方法,该方法用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为 echo,与其功能一致。
现在调用我们的程序必须要指定一个选项。否则会报错。
例子3,对设置的位置参数设置一定的说明提示信息:
# 例子3,对设置的位置参数设置一定的说明提示信息
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here\t重复控制台的输入...")
args = parser.parse_args()
print(args.echo)
控制台下的操作(显示了echo的帮助提示信息):
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here 重复控制台的输入...
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子4,出错的示例,因为argparse会把我们传递给它的选项视为字符串:
# 例子4,出错的示例,因为argparse会把我们传递给它的选项视为字符串
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
控制台下操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h
usage: prog.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -h
usage: prog.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 7, in <module>
print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h 4
usage: prog.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子5,对输入的参数设定类型,因为 argparse 会把我们传递给它的选项视作为字符串:
# 例子5,对输入的参数设定类型
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print(args.square**2)
控制台下的操作:
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h 4
usage: prog.py [-h] square
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h
usage: prog.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -h
usage: prog.py [-h] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
可选参数介绍
例子6,添加可选参数,默认是None:
# 例子6,添加可选参数,默认是None
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
'''
不添加这一选项时程序没有提示任何错误而退出,
表明这一选项确实是可选的。
注意,如果一个可选参数没有被使用时,
相关变量被赋值为 None,在此例中是 args.verbosity,
这也就是为什么它在 if 语句中被当作逻辑假。
使用 --verbosity 选项时,必须指定一些值(任何值).
'''
if args.verbosity:
print("verbosity turned on")
print(type(args.verbosity))
不添加这一选项时程序没有提示任何错误而退出,
表明这一选项确实是可选的。
注意,如果一个可选参数没有被使用时,
相关变量被赋值为 None,在此例中是 args.verbosity,
这也就是为什么它在 if 语句中被当作逻辑假。
使用 --verbosity 选项时,必须指定一些值(任何值).
控制台下的操作:
Windows PowerShell
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbosity 5
verbosity turned on
<class 'str'>
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbosity aaa
verbosity turned on
<class 'str'>
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子7,使用和不使用这个参数,但是不需要传递参数值,只作为标记使用,传入值会报错:
# 例子7,使用和不使用这个参数,但是不需要传递参数值,只作为标记使用
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true") # action="store_true") # action="store_false")
'''
现在,这一选项更多地是一个标志,
而非需要接受一个值的什么东西。
我们甚至改变了选项的名字来符合这一思路。
注意我们现在指定了一个新的关键词 action,
并赋值为 "store_true"。这意味着,
当这一选项存在时,为 args.verbose 赋值为 True。
没有指定时则隐含地赋值为 False。
当你为其指定一个值时,它会报错,符合作为标志的真正的精神。
'''
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
print(args.verbose,type(args.verbose))
控制台操作:
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbose
verbosity turned on
True <class 'bool'>
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
False <class 'bool'>
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbose 22
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 22
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
可选参数的缩写短版本
# 例子8,短选项:
# 例子8,短选项,
# 如果你熟悉命令行的用法,你会发现我还没讲到这一选项的短版本。这也很简单:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
print(type(args.verbose),args.verbose)
控制台操作:
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbose
<class 'bool'> True
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -v
verbosity turned on
<class 'bool'> True
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
<class 'bool'> False
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -v
verbosity turned on
<class 'bool'> True
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
结合位置参数和可选参数
例子9, 结合位置参数和可选参数:
# 例子9, 结合位置参数和可选参数
# 注意顺序无关紧要。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print("the square of {} equals {}".format(args.square, answer))
else:
print(answer)
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 --verbose
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py --verbose 4
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子10:
说明:--verbosity 或者-v后必须紧跟需要的值,但是square的位置可以随意放
# 例子10
# 说明 --verbosity 或者-v后必须紧跟需要的值,但是square的位置可以随意放
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
控制台下操作:
Windows PowerShell
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 1
4^2 == 16
args.verbosity 1
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 2
the square of 4 equals 16
args.verbosity 2
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 3
16
args.verbosity 3
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 0
16
args.verbosity 0
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v ss
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: invalid int value: 'ss'
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子11(指定--verbosity的可选值):
# 上一个例子展示除了最后一个,看上去都不错。
# 最后一个暴露了我们的程序中有一个 bug。我们可以通过限制 --verbosity 选项可以接受的值来修复它:
# 例子11, 注意这一改变同时反应在错误信息和帮助信息里。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v ss
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid int value: 'ss'
usage: prog.py [-h] [-v {0,1,2}] square
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -h
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 0
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 1
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 2
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
现在,我们使用另一种的方式来改变冗长度。
这种方式更常见,
也和 CPython 的可执行文件处理它自己的冗长度参数的方式一致
(参考 python --help 的输出):
例子12(通过参数计数的方式):
# 例子12,
# 现在,让我们使用另一种的方式来改变冗长度。
# 我们引入了另一种动作 count,来数某一个可选参数出现了几次:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
print('args.verbosity',args.verbosity)
控制台操作:
Windows PowerShell
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -vv
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -vvv
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -vvvv
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v -v
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v -v -v
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v -v -v -v
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v -verbosity
usage: prog.py [-h] [-v] square
prog.py: error: argument -v/--verbosity: ignored explicit argument 'erbosity'
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v --verbosity
the square of 4 equals 16
args.verbosity 2
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v --verbosity -v
16
args.verbosity 3
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 --verbosity --verbosity
the square of 4 equals 16
args.verbosity 2
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -v 3
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 3
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子13:
# 例子13,# bugfix: replace == with >=
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
# bugfix: replace == with >=
if args.verbosity >= 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
控制台下操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -vvv
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 -vvvv
the square of 4 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 14, in <module>
if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子14(设定默认值):
# 例子14,我们刚刚引入了又一个新的关键字 default。
# 我们把它设置为 0 来让它可以与其他整数值相互比较。
# 记住,默认情况下如果一个可选参数没有被指定,
# 它的值会是 None,
# 并且它不能和整数值相比较(所以产生了 TypeError 异常)。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
控制台下操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
# 例子15:
# 例子15,
# 如果我们想扩展我们的简短程序来执行其他幂次的运算,而不仅是乘方:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
elif args.verbosity >= 1:
print("{}^{} == {}".format(args.x, args.y, answer))
else:
print(answer)
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
usage: prog.py [-h] [-v] x y
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py -h
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbosity
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -v
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -vv
4 to the power 2 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -vvv
4 to the power 2 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
# 例子16:
# 例子16,
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
print("Running '{}'".format(__file__))
if args.verbosity >= 1:
print("{}^{} == ".format(args.x, args.y), end="")
print(answer)
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -v
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -vvv
Running 'prog.py'
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
# 例子17 引入互斥的参数:
ArgumentParser.add_mutually_exclusive_group(required=False)
创建一个互斥组。 argparse 将会确保互斥组中只有一个参数在命令行中可用
add_mutually_exclusive_group() 方法也接受一个 required 参数,
表示在互斥组中至少有一个参数是需要的
# 例子17 引入互斥的参数
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2
4^2 == 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -q
16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -v
4 to the power 2 equals 16
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python3 prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子18:
# 例子18
# 请注意用法文本中有细微的差异。
# 注意 [-v | -q],它的意思是说我们可以使用 -v 或 -q,但不能同时使用两者
# 例子18
# 请注意用法文本中有细微的差异。
# 注意 [-v | -q],它的意思是说我们可以使用 -v 或 -q,但不能同时使用两者
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
控制台操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py -h
usage: prog.py [-h] [-v | -q] x y
calculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py 3 4
3^4 == 81
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py 3 4 -q
81
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py 3 4 -v
3 to the power 4 equals 81
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>
例子19(type= 可接受任意可调用对象):
# 例子19,
# 默认情况下,ArgumentParser 对象将命令行参数当作简单字符串读入。
# 然而,命令行字符串经常需要被当作其它的类型,
# 比如 float 或者 int。
# add_argument() 的 type 关键词参数允许任何的类型检查和类型转换。
# 一般的内建类型和函数可以直接被 type 参数使用。
import argparse
# type= 可接受任意可调用对象,
# 该对象应传入单个字符串参数并返回转换后的值:
def is_even(string):
value = int(string)
msg = "从控制台得到一个参数:{},并且成功接收--->".format(string)
if value % 2 == 0:
print("是偶数...")
# raise argparse.ArgumentTypeError(msg+"是偶数...")
else:
print("是奇数...")
# raise argparse.ArgumentTypeError(msg+"是奇数...")
return value # 传入单个字符串参数并返回转换后的值
parser = argparse.ArgumentParser(description="Judge a integer whether even or odd.")
parser.add_argument("x", \
type=is_even,\
nargs='?',\
# 对于 nargs 等于 ? 或 * 的位置参数, default 值在没有命令行参数出现时使用。
# choices=range(0, 1000),\
help="a integer passed in...", \
# default='100',
default=100
)
args = parser.parse_args()
print("传入的整数是:",args.x)
控制台下的操作:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py -h
usage: prog.py [-h] [x]
Judge a integer whether even or odd.
positional arguments:
x a integer passed in...
optional arguments:
-h, --help show this help message and exit
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py
传入的整数是: 100
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py 1000
是偶数...
传入的整数是: 1000
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试> python prog.py 10003
是奇数...
传入的整数是: 10003
PS C:\Users\chenxuqi\Desktop\新建文件夹\测试>