最近看一些開源的項目,使用命令行解析工具,針對不同的任務通過修改命令行來讓程序運行起來相當方便。主要使用到的模塊是Python推薦的命令行解析模塊argparse,為了了解它的工作過程,我也在網上找了找一些中文的博客教程,但是感覺對於新手很不友好,后來發現原來官方教程才是最好的教程。下面分享一下學習經驗:
我使用的python版本是python3.5。本文主要參考:https://docs.python.org/3.5/howto/argparse.html#id1
1、命令行
首先,說一下命令行。它在我們windows操作系統中就是cmd的那個大黑框,你可以通過不同的命令來對系統進行操作,但是windows操作系統中我們一般都使用了圖形化的操作界面完成,因此對於命令行使用較少;而在linux中,使用命令行來進行操作就相當普遍了,畢竟是針對程序員設計的操作系統,采用命令行進行相關操作更加的簡潔有效。
我們在使用命令行的時候,對於一個簡單的查看當前目錄下有哪些文件的命令-ls,可以執行以下的操作:
這是一條很有用的命令,他沒有別的任何選項,默認的操作是查看當前目錄下的內容。為了得到當前目錄下的更詳細內容信息,我們可以使用“ls -l”命令:
-l 這個參數,在這里就是一個可選的輸入,它改變了ls命令的原有行為,顯示出了更多的信息。除此之外,我們還可以使用“ls --help”或者“ls -h”來獲取幫助信息:
在這里,‘-h’被稱作短命令,“--help”被稱作長命令,他倆的效果是一樣的。你可以將上圖中的“--help”替換成“-h”而得到相同的結果。
2、argparse使用
如果我們希望對我們編寫的xxx.py程序,通過不同的命令來完成不同的功能的話,就需要使用argparse模塊。下面我們來看看它能干什么,首先看一個幾乎什么也沒干的程序prog.py:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.parse_args()
我們對這個進行運行:
圖中的[1]-[4]分別是運行不同的命令給出的結果。在[1]中,我們采用了傳統的方式對程序進行運行,結果我們什么輸出也沒得到(因為這個程序基本什么也沒做)。在[2]中,我們給了這個程序一個命令“--help”,但是我們得到了一個輸出——一個幫助信息。這是由於代碼中使用了argparse,它自帶一個help信息,也是唯一自帶的,這也可以通過短命令“-h”來得到。[3]和[4]中由於沒有事先定義參數信息,所以給出了錯誤。
3、位置參數
來看下面的一組例子:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("echo") 4 args = parser.parse_args() 5 print(args.echo)
在這段代碼中,我們相對之前的代碼,使用了add_argument和parse_arg()方法。我們對程序進行運行:
在這里,我們使用add_argument方法來指定我們的程序將接收什么樣的命令行,這里將其命名為echo。而parse_arg()方法是用來從指定的操作中返回數據的,在這個例子中,返回的就是echo。你可以看到我們使用了echo這個變量,而定義的時候我們使用的是字符串。這就是argparse做的事情,將變量與字符串對應起來,我們不需要指定給定的參數存儲到哪個變量中。
在之前的例子中,我們使用了命令--help,實際上,你可以編輯它,以顯示更加有用的幫助信息:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("echo", help="echo the string you use here") 4 args = parser.parse_args() 5 print(args.echo)
這時候,我們能夠得到如下的輸出:
在之前的例子中,通過命令行輸入的參數,都是以字符串被存儲的,如果你想要將其當成數字來使用,則需要在add_argument中指定type信息,來告訴程序,你輸入的是數字:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("square", help="display a square of a given number", 4 type=int) 5 args = parser.parse_args() 6 print(args.square**2)
這樣,你就能得到想要的輸出了:
4、可選參數
在上面的例子中,參數是必須添加的,如果不添加,將造成錯誤:
如何做到默認時無需添加參數呢?請看下面的例子:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("--verbosity", help="increase output verbosity") 4 args = parser.parse_args() 5 if args.verbosity: 6 print("verbosity turned on")
注意,這個例子中verbosity前面的“--”。我們下面對這個程序進行運行:
在這個運行的樣例中,可以看到,在第二次運行時,並沒有指定參數,但是程序依舊運行了。這就是可選參數。在一個命令行中,如果可選參數沒有被指定,那么相應的變量值就是None。因此,第二次運行時,沒有執行if語句中的內容。相對於之前的位置參數,可選參數的help不同了。如果你使用了--verbosity,你必須指定某個值,任意值。
在上面的例子中,實際上對於我們有用的verbosity的值只有True或者False,因此我們可以通過加入action關鍵字來對上面的程序進行改寫:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("--verbose", help="increase output verbosity", 4 action="store_true") 5 args = parser.parse_args() 6 if args.verbose: 7 print("verbosity turned on")
我們運行代碼:
注意運行的結果,我們給定action的值是“store_true”,這表明,如果我們指定了可選項--verbose,那么就將True賦值給對應的變量,如果沒有則賦值為False。如果你在后面指定了值,則會報錯(注意看help信息與之前有什么不同)。
短命令:
短命令的指定很簡單,只需要在add_argument里面加一個短命令就可以了,注意使用的是一個橫線“-”
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("-v", "--verbose", help="increase output verbosity", 4 action="store_true") 5 args = parser.parse_args() 6 if args.verbose: 7 print("verbosity turned on")
運行結果如下:
5、混合使用位置參數和可選參數
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("square", type=int, 4 help="display a square of a given number") 5 parser.add_argument("-v", "--verbose", action="store_true", 6 help="increase output verbosity") 7 args = parser.parse_args() 8 answer = args.square**2 9 if args.verbose: 10 print("the square of {} equals {}".format(args.square, answer)) 11 else: 12 print(answer)
我們運行上面的代碼可以得到輸出:
以上是對argparse模塊的一些簡單使用的介紹。實際上,你還可以加入形如"choices = [0, 1, 2]"的命令來限制輸入在0-2的整數(超出會報錯)。通過指定action="count"能夠對可選參數進行計數等等。更多的高級操作可以訪問python官網找到document:
https://docs.python.org/3.5/howto/argparse.html#id1