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\新建文件夹\测试> 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值