Python學習筆記(三) Python中的命令行解析工具argparse


 

 

最近看一些開源的項目,使用命令行解析工具,針對不同的任務通過修改命令行來讓程序運行起來相當方便。主要使用到的模塊是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM