使用命令列引數和 argv

每當從命令列呼叫 Python 指令碼時,使用者可以提供其他命令列引數,這些引數將傳遞給指令碼。這些引數將由系統變數 sys.argv 提供給程式設計師(argv 是大多數程式語言中使用的傳統名稱,它表示“ arg ument v ector”)。

按照慣例,sys.argv 列表中的第一個元素是 Python 指令碼本身的名稱,而其餘元素是使用者在呼叫指令碼時傳遞的標記。

# cli.py
import sys
print(sys.argv)

$ python cli.py
=> ['cli.py']

$ python cli.py fizz
=> ['cli.py', 'fizz']

$ python cli.py fizz buzz
=> ['cli.py', 'fizz', 'buzz']

這是如何使用 argv 的另一個例子。我們首先剝離 sys.argv 的初始元素,因為它包含指令碼的名稱。然後我們將其餘引數組合成一個句子,最後列印該句子,前面加上當前登入使用者的名稱(以便模擬聊天程式)。

import getpass
import sys

words = sys.argv[1:]
sentence = " ".join(words)
print("[%s] %s" % (getpass.getuser(), sentence))

手動解析許多非位置引數時常用的演算法是迭代 sys.argv 列表。一種方法是遍歷列表並彈出它的每個元素:

# reverse and copy sys.argv
argv = reversed(sys.argv)
# extract the first element
arg = argv.pop()
# stop iterating when there's no more args to pop()
while len(argv) > 0:
    if arg in ('-f', '--foo'):
        print('seen foo!')
    elif arg in ('-b', '--bar'):
        print('seen bar!')
    elif arg in ('-a', '--with-arg'):
        arg = arg.pop()
        print('seen value: {}'.format(arg))
    # get the next value
    arg = argv.pop()