天天看點

Argparse子產品:python快捷實作指令行操作

python中的argparse子產品可以友善地實作指令行解釋操作,進而實作豐富的功能接口。

首先我們來看一段Shell代碼:

$ ls
cpython  devguide  prog.py  pypy  rm-unused-function.patch
$ ls pypy
ctypes_configure  demo  dotviewer  include  lib_pypy  lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x  4 wena wena 4096 Feb  8 12:04 devguide
-rwxr-xr-x  1 wena wena  535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb  7 00:59 pypy
-rw-r--r--  1 wena wena  741 Feb 18 01:01 rm-unused-function.patch
$ 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.
...           

接觸過linux的人都知道,上面的一段代碼中使用了‘ls’這個指令行參數,這個‘ls’指令對于linux使用者是經常使用的。

從中上面的使用中我們可以看到:

1、如果我們隻使用‘ls’這個指令,則預設顯示目前目錄中的内容;

2、如果你想要執行這個指令行的其他功能,比如你要顯示另一個目錄pypy。這裡我們要注意的就是“位置參數”(positional argument)。正如第二個指令顯示,‘ls pypy’,‘pypy’是‘ls’指令的位置參數,用于告訴這個指令具體要做什麼;

3、現在我們想要顯示更多的資訊,而不是光光顯示内容的名字,于是我們在後面加了一個‘-l’,這個參數則稱為“可選參數”;

4、‘–help’則幫助你了解這個指令怎麼使用。

好了,回到python來吧,首先我們導入子產品。

基本操作

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()           

寫好上面的程式後,在終端中輸入:

$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
Here is what is happening:           

第一行,僅僅運作這個腳本沒有什麼實質用處。

第二行就展示了argparse module的作用,我們得到了一個不錯的幫助資訊。

很容易知道“–help”和’-h’功能相同,這個可選參數在初始化後就存在,不用自個兒寫。

第三個和第四個指令顯然是錯的,因為啥也沒寫,故會報錯。

現在進行修改:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)            #執行該腳本時前台顯示代碼           

執行以下指令:

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit
$ python3 prog.py foo
foo           

上面程式中,加入了

add_argument()

方法,用來确認我們想使用什麼樣的指令行可選參數。上面程式中加入了“echo”參數,另外

parse_args()

方法一般用于從确定使用的“可選參數”功能中傳回資料,在這個例子中是傳回echo。

再次修改,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)           

然後得到:

$ 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           

再加進一步:

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)
Following is a result of running the code:

$ python3 prog.py 4
Traceback (most recent call last):
  File "prog.py", line 5, in <module>
    print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'           

這樣直接進行操作會發生錯誤,因為子產品預設将輸入的參數識别為

string

類型,我們隻有明确表明為

int

型才可以進行

**

操作。

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)           

然後看結果:

$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'           

接下來介紹“可選”參數:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:     #當不使用--verbosity時,該參數為None
    print("verbosity turned on")           

輸出:

$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ 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
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument           

上面的一段程式用來展示一些東西,當–verbosity被确定時就會列印出資訊,如果沒有則什麼也不顯示,另外要有些需要修改的地方:1、程式的幫助資訊有些歧義,2、verbosity隻需要兩個狀态就可以工作了:Ture和False。

進行修改:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")           
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity           

修改後,這個選項更像一個标志而不是擷取一個值了。注意我們加了一個新的關鍵字:action,然後給了它一個參數”store_true”。這樣的話,當選項被确定的時候,args.verbose被确定為True。不使用選項則為False。

當然也可以使用短的選項參數:

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")           
$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity           

将位置參數和可選參數進行結合:

i

mport 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)           
$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python3 prog.py 4
16
$ python3 prog.py 4 --verbose
the square of 4 equals 16
$ python3 prog.py --verbose 4
the square of 4 equals 16           

上面程式中重新加上了位置參數,如果使用時不明确使用位置參數則會出現錯誤。

下面則使用了多可選參數的設定。

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)           
$ python3 prog.py 4
16
$ python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python3 prog.py 4 -v 1
4^2 == 16
$ python3 prog.py 4 -v 2
the square of 4 equals 16
$ python3 prog.py 4 -v 3
16           

上面輸出中最後一行有點小問題,修改一下:

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)           
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square

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           

參考資料:

https://docs.python.org/3/howto/argparse.html#id1