1. 程式人生 > >Python中的命令列解析工具介紹

Python中的命令列解析工具介紹

轉自新浪微博:@孔令賢HW;

sys.argv

最簡單、最原始的方法就是手動解析了。

  1. import sys
  2. defTestSys():
  3. for arg in sys.argv[1:]:
  4. print(arg)

getopt模組是原來的命令列選項解析器,支援UNIX函式getopt()建立的約定。它會解析一個引數序列,如sys.argv,並返回一個元祖序列和一個非選項引數序列。目前支援的選項語法包括短格式和長格式選項:-a,-bval-b val--noarg--witharg=val--witharg val

。如果只是簡單的命令列解析,getopt還是不錯的選擇。一個例子如下:

  1. try:
  2. options, remainder = getopt.getopt(sys.argv[1:],'o:v',['output=','verbose','version=',])
  3. except getopt.GetoptErroras err:
  4. print'ERROR:', err
  5. sys.exit(1)

簡單說明,如果某個單字元選項需要引數,在他後面加冒號;對於長格式選項,要加等號。如果getopt在輸入引數中遇到了'--',解析會停止。

optparse was deprecated since version 2.7 and will not be developed further; development will continue with the argparse module.

argparse是python標準庫中的模組,以前的optparse已經廢棄。利用argparse,可以完成對命令列的引數定義、解析以及後續的處理。一個很簡單的例子如下(檔名prog.py,這個例子其實什麼也不做):

  1. import argparse
  2. parser = argparse.ArgumentParser(description="some information here")
  3. args = parser.parse_args()

這樣,prog.py就能解析命令列引數了,按照如下方式執行,結果如下:

  1. $ python prog.py
  2. $ python prog.py --help
  3. usage
    : prog.py [-h]
  4. optional arguments:
  5. -h,--help show this help message andexit
  6. $ python prog.py --verbose
  7. usage: prog.py [-h]
  8. prog.py: error: unrecognized arguments:--verbose
  9. $ python prog.py foo
  10. usage: prog.py [-h]
  11. prog.py: error: unrecognized arguments: foo

其實ArgumentParser函式有很多可選引數,prog、usage、description、epilog分別定義解析器的名稱、使用說明、描述、最後的結尾描述。使用parents表示共享同一個父類解析器(這樣就可以共享父類解析器的引數),而這個父類解析器通常是如下定義:

  1. parent_parser = argparse.ArgumentParser(add_help=False)

此外,formatter_class定義description的顯示格式,取值可以是如下三種,具體示例參見此處

  • RawDescriptionHelpFormatter,
  • RawTextHelpFormatter
  • ArgumentDefaultsHelpFormatter

其它還有很多引數,此處就不一一列舉了。

  1. ArgumentParser.add_argument(name or flags...[, action][, nargs][,const][,default][, type][, choices][, required][, help][, metavar][, dest])

每個引數解釋如下:
name or flags - 引數的名字.
action - 遇到引數時的動作,預設值是store。store_const,表示賦值為const;append,將遇到的值儲存成列表,也就是如果引數重複則會儲存多個值; append_const,將引數規範中定義的一個值儲存到一個列表;count,儲存遇到的次數;此外,也可以繼承argparse.Action自定義引數解析;
nargs - 引數的個數,可以是具體的數字,或者是?號,當不指定值時對於Positional argument使用default,對於Optional argument使用const;或者是*號,表示0或多個引數;或者是+號表示1或多個引數.
const - action和nargs所需要的常量值.
default - 不指定引數時的預設值.
type - 引數的型別.
choices - 引數允許的值.
required - 可選引數是否可以省略(僅針對optionals). 
help - 引數的幫助資訊,當指定為argparse.SUPPRESS時表示不顯示該引數的幫助資訊.
metavar - 在usage說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱. 
dest - 解析後的引數名稱,預設情況下,對於可選引數選取最長的名稱,中劃線轉換為下劃線.

一些示例:

  1. # 引數名稱為echo
  2. parser.add_argument("echo", help="echo the string you use here")
  3. # 可以增加型別
  4. parser.add_argument("square", help="display a square of a given number",
  5. type=int)
  6. # 可選引數前面多了--符號,-v是簡寫形式,store_true說明碰到該引數時儲存為true,否則就是false
  7. parser.add_argument("-v","--verbose", help="increase output verbosity",
  8. action="store_true")
  9. # 當然,也可以這樣寫,規定了可選引數的型別和取值範圍
  10. parser.add_argument("-v","--verbosity", type=int, choices=[0,1,2],
  11. help="increase output verbosity")
  12. # count表示遇到該引數幾次,值就加幾,預設值是0
  13. parser.add_argument("-v","--verbosity", action="count",default=0,
  14. help="increase output verbosity")

增加互斥型別的引數:

  1. group= parser.add_mutually_exclusive_group()
  2. group.add_argument("-v","--verbose", action="store_true")
  3. group.add_argument("-q","--quiet", action="store_true")

如果必選引數的值以-開頭,需要在輸入命令時特殊處理:

  1. >>> parser = argparse.ArgumentParser(prog='PROG')
  2. >>> parser.add_argument('foo', nargs='?')
  3. >>> parser.parse_args(['--','-f'])
  4. Namespace(foo='-f')

將多個命令組合進一個程式中,使用子解析器來處理命令列的每個部分。就像svn,以及OpenStack各個元件那樣。

  1. ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, help][, metavar])
  2. >>># create the top-level parser
  3. >>> parser = argparse.ArgumentParser(prog='PROG')
  4. >>> parser.add_argument('--foo', action='store_true', help='foo help')
  5. >>> subparsers = parser.add_subparsers(help='sub-command help')
  6. >>>
  7. >>># create the parser for the "a" command
  8. >>> parser_a = subparsers.add_parser('a', help='a help')
  9. >>> parser_a.add_argument('bar', type=int, help='bar help')
  10. >>>
  11. >>># create the parser for the "b" command
  12. >>> parser_b = subparsers.add_parser('b', help='b help')
  13. >>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
  14. >>>
  15. >>># parse some argument lists
  16. >>> parser.parse_args(['a','12'])
  17. Namespace(bar=12, foo=False)
  18. >>> parser.parse_args(['--foo','b','--baz','Z'])
  19. Namespace(baz='Z', foo=True)
  1. ArgumentParser.parse_known_args(args=None,namespace=None)

其實與parse_args()類似,但當碰到多餘的引數時不丟擲錯誤,而是返回一個二元組。

  1. >>> parser = argparse.ArgumentParser()
  2. >>> parser.add_argument('--foo', action='store_true')
  3. >>> parser.add_argument('bar')
  4. >>> parser.parse_known_args(['--foo','--badger','BAR','spam'])
  5. (Namespace(bar='BAR', foo=True),['--badger','spam'])

對於argparse的高階使用,建議直接看一下OpenStack中Oslo元件的原始碼,會受益匪淺的。

docopt就比較強大了,它是根據你自己寫的help messages(文件描述),自動為你生成parser。使用之前需要下載相應的庫這裡有個介面可以試用一下docopt的強大,借用官方的一個例子:

  1. """Usage: arguments_example.py [-vqrh] [FILE] ...
  2. arguments_example.py (--left | --right) CORRECTION FILE
  3. Process FILE and optionally apply correction to either left-hand side or
  4. right-hand side.
  5. Arguments:
  6. FILE optional input file
  7. CORRECTION correction angle, needs FILE, --left or --right to be present
  8. Options:
  9. -h --help
  10. -v verbose mode
  11. -q quiet mode
  12. -r make report
  13. --left use left-hand side
  14. --right use right-hand side
  15. """
  16. from docopt import docopt
  17. if __name__ =='__main__':
  18. arguments = docopt(__doc__)
  19. print(arguments)

文件描述有兩個部分:Usage

相關推薦

Python命令解析工具介紹

轉自新浪微博:@孔令賢HW; ++++++++++++++++++++++ sys.argv 最簡單、最原始的方法就是手動解析了。 import sysdefTestSys():for arg in sys.argv[1:]:print(arg) getopt

Python 命令解析工具 Argparse介紹(二)

今天學習python的argparse模組。看到了這樣一篇文章,連結 http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.html,題目是Python 命令列解析工具 Argparse介紹(一),翻譯自pyt

python 命令解析工具 argparse 基本使用

parser = argparse.ArgumentParser() #建立物件 parser.add_argument("file") #新增引數 parser.add_

python命令解析argparse

# -*- coding: utf-8 -*- import argparse args = "-f hello.txt -n 1 2 3 -x 100 -y b -z a -q hello @args.txt i_am_bar -h".split() # 使用

Java命令解析工具Apache CLI

Apache Commons CLI 是 Apache 下面的一個解析命令列輸入的工具包,該工具包還提供了自動生成輸出幫助文件的功能。 Apache Commons CLI 支援多種輸入引數格式,主要支援的格式有以下幾種: POSIX(Portable Operating

Python程式設計:使用sys、argparse、click、fire實現命令解析

python實現指令碼命令列的庫有: 內建庫sys 內建庫argparse 第三方庫click 第三方庫fire 內建庫sys sys.argv 包含命令列引數列表,第一個引數是檔名 sys_demo.py import sys d

常用的python命令解析

常用的python命令列解析庫,這兒介紹3種: 1.argparse 2.click 3.fire   argparse是python自帶的模組,要經歷解析器初始化、引數定義、解析一套流程,使用起來有些繁瑣。 一篇argparse使用的文章:https://ww

python常用的命令解析

1、argparse argparse是python自帶的模組,要經歷解析器初始化、引數定義、解析一套流程,使用起來有些繁瑣。 argpase的使用: class Calculator(object): """ 計算器 """

Python命令解析器argparse的使用

argparse是Python內建的一個用於命令項選項與引數解析的模組,在編寫指令碼的過程中是非常常用的。 在其使用中主要包含三個步驟: import argparse parser = argparse.ArgumentParser(descripti

Python打造命令工具

與命令列相關的 Python 語言 使用 sys.argv 獲取命令列引數 import sys print(sys.argv) 使用 sys.stdin 和 fileinput 讀取標準輸入 import sys for line in sys.stdin:

python-argparse命令選項與引數解析

設定一個解析器 使用argparse的第一步就是建立一個解析器物件,並告訴它將會有些什麼引數。那麼當你的程式執行時,該解析器就可以用於處理命令列引數。 解析器類是 ArgumentParser 。

python命令解析argparse模組

主要是比較理解兩個函式:parse_args()和parse_known_args() ① parse_args() import argparse import sys parse = arg

python命令解析模組-argparse

主要參考blog: argparse模組是Python的命令列解析模組,可以很方便的進行引數的傳遞,而不需要修改原始碼。 argparse的使用主要有三步,建立解析物件,新增命令列引數,進行引數的解析 看程式碼和註釋: import argparse

python命令解析模組--argparse

  python命令列解析模組--argparse 目錄 簡介 詳解ArgumentParser方法 詳解add_argument方法   參考文件:  https://www.jianshu.com/p/aac9f8079a53 https://www

JAVA呼叫linux的shell命令工具

二話不說,直接上程式碼! package cn.sigangjun.util; /** * <p>Title:java call linux shell util </p> * <p>Description: java call

Python命令引數解析

文章作者:Tyan 部落格:noahsnail.com  |  CSDN  |  簡書 命令列引數解析在程式語言中基本都會碰到,Python中內建了一個用於命令項選項與引數解析的模組argparse。下面主要介紹兩種解析Python命令列引數的方式。

深入理解python 命令解析模組optparse(optparse原始碼解讀)

optparse是python用來解析命令列引數的,最早是getopt,option比getopt更強大和靈活。最新的命令列解析使用argparse,因此optparse今後將不會再被開發,optparse在python的原始碼位置是Lib/optparse

Python獲取命令輸出 將螢幕輸出的log儲存檔案

# -*- coding:utf-8 -*- import os command = 'ping www.baidu.com '#可以直接在命令列中執行的命令 r = os.popen(comman

python製作命令工具——fire

**前言** 本篇教程的目的是希望大家可以通讀完此篇之後,可以使用python製作一款符合自己需求的linux工具。 本教程使用的是google開源的python第三方庫:fire 無論是學生黨自己做著練手,還是工作中確有需求,本篇都儘可能通過簡單的例子來示範該第三方庫的用法,其中若有描述不當的地方

Python的lambda的簡單介紹

好的 cto turn 匿名 urn 這樣的 簡單介紹 對象 一個表 在學習python的過程中,lambda的語法經常出現,現在將它整理一下,以備日後查看。    1、lambda是什麽? 舉個例子如下: 1 func=lambda x:x+1 2 print(fu