自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 中很好用的命令行參數(shù)解析工具

開發(fā) 后端
Python 本身就提供了三個命令行參數(shù)解析模塊,我這里羅列一下它們的大致情況供你了解。

 

Python 做為一個腳本語言,可以很方便地寫各種工具。當你在服務端要運行一個工具或服務時,輸入?yún)?shù)似乎是一種硬需(當然你也可以通過配置文件來實現(xiàn))。

如果要以命令行執(zhí)行,那你需要一個命令行參數(shù)解析的模塊來幫你做這個苦力活。

Python 本身就提供了三個命令行參數(shù)解析模塊,我這里羅列一下它們的大致情況供你了解。

  •  getopt,只能簡單的處理命令行參數(shù)
  •  optparse,功能強大,易于使用,可以方便地生成標準的、符合Unix/Posix 規(guī)范的命令行說明。(Python2.7以后棄用,不會繼續(xù)發(fā)展)
  •  argparse,使其更加容易的編寫用戶友好的命令行接口。它所需的程序進程了參數(shù)定義,argparse將更好的解析sys.argv。同時argparse模塊還能自動生成幫助及用戶輸入錯誤參數(shù)時的提示信息。

很多初學者可能會使用getopt,上手簡單功能也簡單。比如說optget無法解析一個參數(shù)多個值的情況,如 --file file1 file2 file3,而 optparse 實際上我沒有用過,但是考慮到它在Python2.7后已經(jīng)不再維護,我們通常也不會使用它。

接下來只剩下argparse 這一神器,它幾乎能滿足我對命令解析器的所有需求。它支持解析一參數(shù)多值,可以自動生成help命令和幫助文檔,支持子解析器,支持限制參數(shù)取值范圍等等功能。

HelloWorld

不管學習什么東西,首先第一步都應該是掌握它的大體框架。而使用 argparse 前,框架很簡單,你只需要記住這三行。 

  1. # mytest.py  
  2. import argparse 
  3. parser = argparse.ArgumentParser(description="used for test" 
  4. args = parser.parse_args() 

現(xiàn)在可以嘗試一下 

  1. [root@localhost ~]# python mytest.py -h  
  2. usage: mytest.py [-h]  
  3. used for test  
  4. optional arguments:  
  5.   -h, --help  show this help message and exit  
  6. [root@localhost ~]#   
  7. [root@localhost ~]#   
  8. [root@localhost ~]# python mytest.py  
  9. [root@localhost ~]#  

已經(jīng)可以使用了。

1. 入門配置

這里先講一下,比較常用的參數(shù)配置。

  •  調(diào)試:debug
  •  版本號:version 
  1. import argparse  
  2. parser = argparse.ArgumentParser()  
  3. parser.add_argument('--version', '-v', action='version' 
  4.                     version='%(prog)s version : v 0.01' 
  5.                     help='show the version' 
  6. parser.add_argument('--debug', '-d', 
  7.                     action='store_true' 
  8.                     help='show the version' 
  9.                     default=False 
  10. args = parser.parse_args()  
  11. print("=== end ===") 

上面debug處的配置,需要講一下的是 action='store_true' 和 default = False 的作用和區(qū)別

  •  store_true:一旦指定了 -d 或者 --debug ,其值就為 True,store_false則相反
  •  default=False:未指定 -d 或者 --debug,其值就默認為False

當我們執(zhí)行 python mytest.py -v,就會打印 version 里的內(nèi)容。 

  1. [root@localhost ~]# python mytest.py -v  
  2. mytest.py version : v 0.01  
  3. [root@localhost ~]#  

一旦執(zhí)行時,指定了參數(shù) -v ,執(zhí)行到 parser.parse_args() 就會退出程序,不會打印最后的=== end ===

2. 參數(shù)種類

參數(shù)可分為 必選參數(shù)(positional arguments) 和 可選參數(shù)(optional arguments)。

在argsparse 里如何實現(xiàn)呢?

必選參數(shù)

用單詞做參數(shù),默認就為必選參數(shù) 

  1. # mytest.py  
  2. import argparse  
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("name")  
  5. args = parser.parse_args()  
  6. print(args.name) 

不指定name參數(shù)運行一下:python mytest.py 

  1. [root@localhost ~]# python mytest.py  
  2. usage: mytest.py [-h] name  
  3. mytest.py: error: too few arguments  
  4. [root@localhost ~]# 

如預期一樣,報錯了,說缺少參數(shù)。那我們指定一下:python mytest.py name wangbm 

  1. [root@localhost ~]# python mytest.py wangbm  
  2. wangbm  
  3. [root@localhost ~]#  

可選參數(shù)

有兩種方式:

  •  單下劃線 - 來指定的短參數(shù),如-h;
  •  雙下劃線 -- 來指定的長參數(shù),如--help 
  1. # mytest.py  
  2. import argpars  
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("-v", "--verbosity",  
  5.                     help="increase output verbosity" 
  6. args = parser.parse_args()  
  7. if args.verbosity:  
  8.     print("verbosity turned on")  
  9. else:  
  10.     print("verbosity turned off") 

運行 python mytest.py,不會報錯。 

  1. [root@localhost ~]# python mytest.py  
  2. verbosity turned off  
  3. [root@localhost ~]# 

3. 參數(shù)類型

有的參數(shù),是字符串,有的參數(shù),是數(shù)值。

為了對命令行中的參數(shù)進行有效的約束,我們可以事先對參數(shù)的類型進行聲明。argparse 會對參數(shù)進行校驗,不通過時,會直接拋出錯誤。 

  1. # mytest.py  
  2. import argparse  
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("name")  
  5. parser.add_argument("age", type=int 
  6. args = parser.parse_args()  
  7. print(args.name)  
  8. print(args.age) 

測試一下唄。 

  1. [root@localhost ~]# python mytest.py wangbm eighteen  
  2. usage: mytest.py [-h] name age  
  3. mytest.py: error: argument age: invalid int value: 'eighteen'  
  4. [root@localhost ~]#   
  5. [root@localhost ~]# python mytest.py wangbm 18  
  6. wangbm  
  7. 18  
  8. [root@localhost ~]# 

你看,寫 eighteen 就不行,提示類型不合法,只有寫 18 才行。

4 互斥參數(shù)

有些參數(shù),是互斥的,有你無我。比如,性別。

在 argparse 中如何實現(xiàn)? 

  1. import argparse  
  2. parser = argparse.ArgumentParser()  
  3. group = parser.add_mutually_exclusive_group()  
  4. group.add_argument("-m", "--male", action="store_true" 
  5. group.add_argument("-f", "--female", action="store_true" 
  6. args = parser.parse_args() 

如果同時指定了這兩個參數(shù),就會報錯。 

  1. [root@localhost ~]# python mytest.py -f  
  2. [root@localhost ~]# python mytest.py -m  
  3. [root@localhost ~]# python mytest.py -m -f   
  4. usage: mytest.py [-h] [-m | -f]  
  5. mytest.py: error: argument -f/--female: not allowed with argument -m/--male  
  6. [root@localhost ~]#  

5 可選值

如果是性別,可以像上面那樣放在兩個參數(shù)里然后用互斥組來約束,也可以放在一個參數(shù)里,在argparse里限制再在外層做判斷。 

  1. # mytest.py  
  2. import argparse  
  3. parser = argparse.ArgumentParser()  
  4. parser.add_argument("-g", "--gender", default='male' 
  5.                     choices=['male', 'female'])  
  6. args = parser.parse_args() 
  7. print(args.gender) 

試著執(zhí)行一下,發(fā)現(xiàn)性別只能是男或女,不能為人妖。 

  1. [root@localhost ~]# python mytest.py --gender male  
  2. male  
  3. [root@localhost ~]# python mytest.py --gender female  
  4. female  
  5. [root@localhost ~]#   
  6. [root@localhost ~]#   
  7. [root@localhost ~]# python mytest.py --gender other  
  8. usage: mytest.py [-h] [-g {male,female}]  
  9. mytest.py: error: argument -g/--gender: invalid choice: 'other' (choose from 'male', 'female')  
  10. [root@localhost ~]# 

6. 指定文件

經(jīng)常會有那種要在腳本中指定配置文件或者其他文件的需求??梢允褂孟旅娴呐渲?nbsp;

  1. import argparse  
  2. parser = argparse.ArgumentParser()  
  3. parser.add_argument('--file', '-f', action='append' 
  4.                     dest='files' 
  5.                     help=('additional yaml configuration files to use'),  
  6.                     type=argparse.FileType('rb'))  
  7. args = parser.parse_args() 

dest=files,是說將命令行中,--file 的參數(shù)值賦值給變量files,你可以用args.files訪問。

action=append,由于我們會有指定多個文件的需求,那就指定多次--file ,argparse會將其放在一個list里。

type=argparse.FileType('rb'),既然是指定文件,那么參數(shù)應該為路徑,并指定打開模式為rb,如果如果要取得文件內(nèi)容,可以用 args.files[0].read()

7. 子解析器

如果你對命令行,有過足夠多的接觸,就會知道有些情況下會有子解析器。

這里我以自己工作中,碰到的例子來舉個例子。 

  1. cloud-init --debug single -name mymodule 

其中 single 后面是一個子解析器。 

  1. # cloud-init.py  
  2. def main_single(name, args):  
  3.     print("name: ", name)  
  4.     print("args: ", args)  
  5.     print("I am main_single")  
  6. # 添加一個子解析器  
  7. subparsers = parser.add_subparsers()  
  8. parser_single = subparsers.add_parser('single',  
  9.                       help='run a single module' 
  10. # 對single 子解析器添加 action 函數(shù)。  
  11. parser_single.set_defaults(action=('single', main_single)) 
  12. require=True: 命令行指定了single解析器,必須帶上--name的參數(shù)。  
  13. parser_single.add_argument("--name", '-n', action="store" 
  14.                            help="module name to run" 
  15.                            required=True 
  16. args = parser.parse_args()  
  17. (name, functor) = args.action  
  18. if name in ["single"]:  
  19.     functor(name, args) 

執(zhí)行命令cloud-init single -name mymodule,輸出如下 

  1. name:  single  
  2. args:  Namespace(action=('single', <function main_single at 0x0000000003F161E0>), debug=Falsefile=Nonename='mymodule' 
  3. I am main_single 

以上,就是 argparse 的使用方法。 

 

責任編輯:龐桂玉 來源: 機器學習算法與Python學習
相關推薦

2023-07-05 08:38:48

GolangGo語言

2021-11-15 14:30:49

Pythonargparse編程語言

2011-01-18 19:11:26

Postfix命令行

2010-03-10 17:23:37

Python 命令行參

2021-01-13 05:29:26

命令行

2019-11-06 19:21:07

Pythonargparse解釋器

2024-04-29 07:38:20

PythonDocopt開發(fā)

2022-02-17 18:21:47

工具HTTPie客戶端

2020-12-10 16:16:08

工具代碼開發(fā)

2020-12-11 06:44:16

命令行工具開發(fā)

2010-11-24 15:33:59

mysql命令行參數(shù)

2009-07-20 09:55:30

華為命令行解析華為認證

2010-08-20 10:05:23

用戶命令

2009-07-15 17:10:26

Jython解析命令行

2018-05-04 09:15:35

PythonPlumbum命令行

2010-07-15 10:47:22

Perl命令行

2020-08-09 18:06:57

Linux系統(tǒng)工具

2022-08-01 08:30:26

Python命令行

2023-06-09 07:45:29

Kuberneteskubectl

2021-07-16 16:47:40

命令行工具開源
點贊
收藏

51CTO技術棧公眾號