如果您的 Python 代碼需要在實際的 Production 環境運行,那麼您很有可能需要清晰定義您的 Python 代碼與 command line 的互動。
譬如許多公司的在執行 Python 代碼的時候,都會選擇使用某些 Linux 的平台(例如 Ubuntu、Red Hat Enterprise Linux 等)去安排或定時(schedule)一些代碼的運行。
這時候,我們便需要學會如何:
- 告訴系統運行代碼時需要用到的參數(program parameters)
- 讓系統知道 Python 代碼的運行成功與否
簡介:Command line 如何與程式互動?
在介紹 Python 如何與 Command line 互動之前,我們先科普一下電腦程式是如何與 command line 互動。
粗略來說,電腦程式(例如我們的 Python 代碼)是一個處理輸入參數(input)而輸出結果(output)的程序(process)。
而由於我們有以上的定義,電腦程式會有以下 2 個重要的元素:
- 程式輸入參數(Program Parameter):這是電腦程式從 command line 獲取的其中一個輸入(input)
- 程式輸出(Return):這是電腦程式告訴 command line 執行的結果
因此,我們以下會集中討論 Python 與程式輸入參數和程式輸出的關係。
前提:使用 VS Code
以下的示範我們會使用 VS Code。如果您不知道如何使用 VS Code,可以參考這裡:
- VSCode 1/5: macOS 最佳 Python 編程工具?豐富的插件商店?Visual Studio Code 安裝攻略
- VSCode 2/5: 設定虛擬環境(Virtual Env), 管理 Python 專案!
- VSCode 3/5: 實戰篇!版面介紹、管理 Python 專案和多個 .py
- VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!
- VSCode 5/5: Jupyter Notebook 互動編程?實在太方便了
程式輸入參數:使用 sys.argv
在我們研究一個例子以前,我們先來學習一個新的 Python 語法:sys.argv
。
如上面提及,程式輸入參數(program parameter)是電腦程式獲取執行輸入(input)的重要一環。
Python 與程式輸入參數的互動就是這個 sys.argv
。
我們先來看看 sys.argv
到底會回傳甚麼。首先我們定義一個新的 Python 檔案(我把它命名為 example.py),並輸入以下簡單的 2 行:
import sys print(sys.argv)
完成後,我們到 VS Code 的 Terminal 輸入以下的指令:
python3 example.py
由上圖可見,sys.argv
的回傳是一個列表。而目前這個列表只有一個子項(’example.py’)。我們再來試試更多組合吧!
python3 example.py 100 "apple" "banana"
由以上例子可見,如果我們提供更加多的輸入,例如 “100”、“apple” 與 “banana”,那麼 sys.argv
這個列表將會有多於 1 個的子項。
由此可見,sys.argv
的項目如下:
- 第 1 項是 Python 檔案的名稱,例如以上的「example.py」
- 第 2 項或以上是程式輸入參數,每一個子項都會被轉為一個文字(String)
完整例子
了解以上的設計後,我們可以來看看一個完整使用 sys.argv 的例子了!
這裡我們寫一個簡單的 Python 檔案,計算 (a + b) x c 的結果:
import sys def add_two_numbers_then_multiply(): num_1 = int(sys.argv[1]) num_2 = int(sys.argv[2]) num_3 = int(sys.argv[3]) return (num_1 + num_2) * num_3 if __name__ == '__main__': result = add_two_numbers_then_multiply() print(result)
與所有 Python 代碼一樣,我們在 example.py 裡定義一個功能 add_two_numbers_then_multiply()
,然後使用 if __name__ == '__main__'
告訴 Python 如何執行這個檔案。
python3 example.py 2 4 8
在 command line 輸入以上指令後,我們執行的結果會出現 48,亦即 (2 + 4) x 8 的結果。而 add_two_numbers_then_multiply()
是透過我們在 command line 提供的這三個數字,得知我們希望用於計算的數字輸入。
稍作改良
import sys def add_two_numbers_then_multiply(num_1: int, num_2: int, num_3: int): return (num_1 + num_2) * num_3 if __name__ == '__main__': arg = tuple([int(x) for x in sys.argv[1:]]) result = add_two_numbers_then_multiply(*arg) print(result)
這裡我們呈上一個做到同樣效果的 Python 代碼,但我認為這比上述的例子較好,為什麼呢?
在編程裡,我認為每一個功能都應該是如實地稟告它的用途(does what it says it does)。因此,在第一個例子裡,我們的 add_two_numbers_then_multiply()
沒有任何參數便顯得十分奇怪。
在第二個例子裡,add_two_numbers_then_multiply(num1, num2, num3)
有 3 個參數,這便合理多了,因為您確實知道這個功能從哪裡收集輸入。
而由於我們需要以某種形式呼喚 add_two_numbers_then_multiply
,這時我們便可以使用特定的語法把 sys.argv
轉換成 add_two_numbers_then_multiply()
的輸入。
這個特定的語法就是上面的 tuple([int(x) for x in sys.argv[1:]])
。還記得元組(tuple)嗎?
元組在 Python 裡可以作為程式的輸入使用。
例如我們現在有一個 tuple 名叫 tuple_example
是 (1, 2, 3)
,Python 容許您透過使用加入一個星號,便可以將 arg
變成一個功能的輸入。如果我們呼叫 add_two_numbers_then_multiply(*tuple_example)
的話,Python 便會把 num_1
設為 1、num_2
設為 2、num_3
設為 3。
透過這個語法,我們便可以維持
的完整,但又使用 add_two_numbers_then_multiply
sys.argv
從 command line 輸入參數了!
結語
希望您透過以上的簡介學會如何使用 sys.argv
讓 Python 讀取您從 command line 輸入的參數吧!下一篇我們會延續這個討論,讓我們學會如何把妥當的 Python 結束狀況回傳。