Python - 命令列引數



Python 命令列引數

Python 命令列引數提供了一種方便的方式,可以在執行程式時從命令列接受一些資訊。我們通常將這些值與 Python 指令碼的名稱一起傳遞。

要執行 Python 程式,我們在作業系統的命令提示符終端中執行以下命令。例如,在 Windows 中,以下命令輸入到 Windows 命令提示符終端中。

$ python script.py arg1 arg2 arg3

這裡 Python 指令碼名稱為 script.py,其餘三個引數 - arg1 arg2 arg3 是程式的命令列引數。

如果程式需要從使用者那裡接受輸入,則使用 Python 的 input() 函式。當程式從命令列執行時,使用者輸入從命令終端接受。

示例

name = input("Enter your name: ")
print ("Hello {}. How are you?".format(name))

程式從命令提示符終端執行如下所示:

command prompt

在執行時傳遞引數

很多時候,您可能需要將程式要使用的資料放在命令列本身,並在程式內部使用它。在命令列中提供資料的示例可能是 Windows 或 Linux 中的任何 DOS 命令。

在 Windows 中,您使用以下 DOS 命令將檔案 hello.py 重新命名為 hi.py。

C:\Python311>ren hello.py hi.py

在 Linux 中,您可以使用 mv 命令:

$ mv hello.py hi.py

這裡 ren 或 mv 是需要舊檔名和新檔名的命令。由於它們與命令一起放在一行中,因此稱為命令列引數。

您可以從命令列將值傳遞給 Python 程式。Python 將引數收集到列表物件中。Python 的 sys 模組透過 sys.argv 變數提供對任何命令列引數的訪問。sys.argv 是命令列引數的列表,sys.argv[0] 是程式,即指令碼名稱。

示例

hello.py 指令碼使用 input() 函式在指令碼執行後接受使用者輸入。讓我們將其更改為從命令列接受輸入。

import sys
print ('argument list', sys.argv)
name = sys.argv[1]
print ("Hello {}. How are you?".format(name))

從命令列執行程式,如下面的圖所示:

command-line

輸出如下所示:

C:\Python311>python hello.py Rajan
argument list ['hello.py', 'Rajan']
Hello Rajan. How are you?

命令列引數始終儲存在字串變數中。要將它們用作數字,您可以使用型別轉換函式適當地轉換它們。

示例

在以下示例中,兩個數字作為命令列引數輸入。在程式內部,我們使用 int() 函式將它們解析為整型變數。

import sys
print ('argument list', sys.argv)
first = int(sys.argv[1])
second = int(sys.argv[2])
print ("sum = {}".format(first+second))

它將產生以下輸出

C:\Python311>python hello.py 10 20
argument list ['hello.py', '10', '20']
sum = 30

Python 的標準庫包含幾個有用的模組來解析命令列引數和選項:

  • getopt - C 風格的命令列選項解析器。

  • argparse - 用於命令列選項、引數和子命令的解析器。

Python getopt 模組

Python 提供了一個 **getopt** 模組,幫助你解析命令列選項和引數。這個模組提供了兩個函式和一個異常來啟用命令列引數解析。

getopt.getopt() 方法

此方法解析命令列選項和引數列表。以下是此方法的簡單語法:

getopt.getopt(args, options, [long_options])

以下是引數的詳細說明:

  • **args** - 這是要解析的引數列表。

  • **options** - 這是指令碼想要識別的選項字母字串,需要引數的選項後面應跟一個冒號 (:)。

  • **long_options** - 這是一個可選引數,如果指定,則必須是一個包含長選項名稱的字串列表,這些選項應得到支援。需要引數的長選項後面應跟一個等號 ('=')。要僅接受長選項,options 應為空字串。

此方法返回一個包含兩個元素的值:第一個是 (option, value) 對的列表,第二個是剝離選項列表後剩下的程式引數列表。

返回的每個選項-值對都將選項作為其第一個元素,短選項字首為連字元 (例如,'-x'),長選項字首為兩個連字元 (例如,'--long-option')。

異常 getopt.GetoptError

當在引數列表中找到無法識別的選項或當需要引數的選項未提供引數時,會引發此異常。

異常的引數是一個字串,指示錯誤的原因。屬性 msg 和 opt 給出了錯誤訊息和相關選項。

示例

假設我們想透過命令列傳遞兩個檔名,並且我們還想提供一個選項來檢查指令碼的使用情況。指令碼的使用方法如下:

usage: test.py -i <inputfile> -o <outputfile>

以下是測試指令碼 test.py:

import sys, getopt
def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
   except getopt.GetoptError:
      print ('test.py -i <inputfile> -o <outputfile>')
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print ('test.py -i <inputfile> -o <outputfile>')
         sys.exit()
      elif opt in ("-i", "--ifile"):
         inputfile = arg
      elif opt in ("-o", "--ofile"):
         outputfile = arg
   print ('Input file is "', inputfile)
   print ('Output file is "', outputfile)
if __name__ == "__main__":
   main(sys.argv[1:])

現在,按如下方式執行上述指令碼:

$ test.py -h
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i BMP -o
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i inputfile -o outputfile
Input file is " inputfile
Output file is " outputfile

Python argparse 模組

**argparse** 模組提供了編寫非常易於使用的命令列介面的工具。它處理如何解析在 **sys.argv** 列表中收集的引數,自動生成幫助資訊,並在給出無效選項時發出錯誤訊息。

設計命令列介面的第一步是設定解析器物件。這是透過 argparse 模組中的 ArgumentParser() 函式完成的。該函式可以將解釋性字串作為 description 引數。

首先,我們的指令碼將在沒有任何引數的情況下從命令列執行。仍然使用解析器物件的 **parse_args()** 方法,它什麼也不做,因為沒有給出任何引數。

import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
args=parser.parse_args()

當執行上述指令碼時:

C:\Python311>python parser1.py
C:\Python311>python parser1.py -h
usage: parser1.py [-h]
sample argument parser
options:
   -h, --help show this help message and exit

第二個命令列用法給出 **-help** 選項,該選項會生成如下所示的幫助訊息。**-help** 引數預設可用。

現在讓我們定義一個引數,該引數對於指令碼執行是必須的,如果沒有給出,指令碼應該丟擲錯誤。這裡我們透過 add_argument() 方法定義引數 'user'。

import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args=parser.parse_args()
if args.user=="Admin":
   print ("Hello Admin")
else:
   print ("Hello Guest")

此指令碼的幫助資訊現在顯示了一個位置引數,形式為 'user'。程式檢查其值是否為 'Admin',並列印相應的訊息。

C:\Python311>python parser2.py --help
usage: parser2.py [-h] user
sample argument parser
positional arguments:
   user
options:
   -h, --help show this help message and exit

使用以下命令:

C:\Python311>python parser2.py Admin
Hello Admin

但以下用法顯示 Hello Guest 訊息。

C:\Python311>python parser2.py Rajan
Hello Guest

add_argument() 方法

我們可以在 add_argument() 方法中為引數分配預設值。

import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?',default="Admin")
args=parser.parse_args()
if args.user=="Admin":
   print ("Hello Admin")
else:
   print ("Hello Guest")

這裡 nargs 是應該消耗的命令列引數的數量。'?'。如果可能,將從命令列消耗一個引數,並將其作為單個專案生成。如果沒有命令列引數,則將生成來自 default 的值。

預設情況下,所有引數都被視為字串。要顯式提及引數的型別,請在 add_argument() 方法中使用 type 引數。所有 Python 資料型別都是 type 的有效值。

import argparse
parser=argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args=parser.parse_args()
x=args.first
y=args.second
z=x+y
print ('addition of {} and {} = {}'.format(x,y,z))

它將產生以下輸出

C:\Python311>python parser3.py 10 20
addition of 10 and 20 = 30

在以上示例中,引數是必須的。要新增可選引數,請在其名稱前加上雙破折號 --。在以下情況下,surname 引數是可選的,因為它以雙破折號(--surname)為字首。

import argparse
parser=argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args=parser.parse_args()
print ("My name is ", args.name, end=' ')
if args.surname:
   print (args.surname)

以單破折號為字首的引數的一個字母名稱充當短名稱選項。

C:\Python311>python parser3.py Anup
My name is Anup
C:\Python311>python parser3.py Anup --surname Gupta
My name is Anup Gupta

如果希望引數的值僅來自定義的列表,則將其定義為 choices 引數。

import argparse
parser=argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args=parser.parse_args()
print ("My subject is ", args.sub)

請注意,如果引數的值不在列表中,則會顯示無效選擇錯誤。

C:\Python311>python parser3.py Physics
My subject is Physics
C:\Python311>python parser3.py History
usage: parser3.py [-h] {Physics,Maths,Biology}
parser3.py: error: argument sub: invalid choice: 'History' (choose from
'Physics', 'Maths', 'Biology')
廣告