Python 命令行解析工具 Argparse介紹

最近在研究pathon的命令行解析工具,argparse,它是Python標準庫中推薦使用的編寫命令行程序的工具。html

之前總是作UI程序,今天試了下命令行程序,感受至關好,不用再花大把時間去研究界面問題,尤爲是vc++中尤爲繁瑣。python

如今用python來實現命令行,核心計算模塊能夠用c本身寫擴展庫,效果挺好。c++

學習了argparse,在官方文檔中找到一篇toturial,簡單翻譯了下。ide

http://docs.python.org/2/howto/argparse.html#id1工具

Argparse Tutorial

這篇教程簡明地介紹了Python標準庫推薦使用的命令行參數解析模塊——Argparse的使用。學習

基本概念ui

  在這篇教程中咱們經過一個常見的ls命令來展現argparse的功能。this

複製代碼
$ 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.
複製代碼

從以上的四個命令中,咱們可以瞭解如下幾個基本概念:spa

  • ls命令在沒有參數的狀況下也是能夠運行的,默認打印出當前目錄下的全部內容。
  • 若是咱們想讓它展現更多內容,那麼咱們須要給它多一點參數。在這種狀況下,咱們想顯示一個不一樣的目錄,pypy。咱們所作的就是明確了常見的定位參數(positional argument),這樣命名是由於須要程序根據參數在命令行中的位置而決定作什麼。這個概念與命令cp更爲接近,它的用法是cp src dest,src表示的是你想要拷貝的文件,dest表示你想要將文件拷貝到哪裏。
  • 如今,我想要改變程序的行爲。在咱們的例子中,我想顯示文件的向西信息而不單單是文件名,參數-l 則是咱們所知道的可選參數(optinal argument)
  • 最後一句是顯示幫助的文檔的一個片斷,當你遇到你從未使用過的命令時,你能夠經過它學習怎麼使用。

基本認識命令行

    咱們從一個基本的程序開始(它什麼也不作)

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

運行結果:

複製代碼
$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
複製代碼

結果分析:

  • 若不給參數而運行這個程序,將不會獲得任何結果。
  • 第二條命名顯示了使用的argparse的好處,你什麼也沒作,卻獲得了一個很好的幫助信息。
  • 咱們無需人爲設置--help參數,就能獲得一個良好的幫助信息。可是若給其餘參數(好比foo)就會產生一個錯誤。

位置參數

   首先,給一個例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo

運行結果:

複製代碼
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit
$ python prog.py foo
foo
複製代碼

結果分析:

  • 此次,咱們增長了一個add_argument()方法,用來設置程序可接受的命令行參數。
  • 如今要運行程序,就必須設置一個參數。
  • parse_args()方法實際上從咱們的命令行參數中返回了一些數據,在上面的例子中是echo
  • 這個像「魔法」同樣的過程,是argparse自動完成的。

儘管自動產生的幫助信息展現地很美觀,可是咱們仍然沒法只根據echo這個參數知道它是作什麼的。因此,咱們增長了一些東西,使得它變得更有用。

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

運行結果:

複製代碼
$ python 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
複製代碼

在此基礎上,咱們再多改變一點:(計算輸入參數square的平方)

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

下面是運行結果:

$ python 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'

這個程序並不能正確運行,由於argparse會將輸入看成字符串處理,因此咱們須要設置它的類型:(type=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
複製代碼

下面是運行結果:

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

如今,這個程序可以順利運行,並且可以處理一些錯誤輸入。

From: http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.html

相關文章
相關標籤/搜索