目錄
    Add a header to begin generating the table of contents

    Python 與 cmd line 互動 1/2: 用 sys.argv 從 bash/cmd 傳入參數

    Python 與 cmd line 互動 1/2: 用 sys.argv 從 bash/cmd 傳入參數
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      如果您的 Python 代碼需要在實際的 Production 環境運行,那麼您很有可能需要清晰定義您的 Python 代碼與 command line 的互動。

      譬如許多公司的在執行 Python 代碼的時候,都會選擇使用某些 Linux 的平台(例如 Ubuntu、Red Hat Enterprise Linux 等)去安排或定時(schedule)一些代碼的運行。

      這時候,我們便需要學會如何:

      1. 告訴系統運行代碼時需要用到的參數(program parameters)
      2. 讓系統知道 Python 代碼的運行成功與否

      簡介:Command line 如何與程式互動?

      在介紹 Python 如何與 Command line 互動之前,我們先科普一下電腦程式是如何與 command line 互動。

      粗略來說,電腦程式(例如我們的 Python 代碼)是一個處理輸入參數(input)而輸出結果(output)的程序(process)。

      我是廣告 ^o^

      而由於我們有以上的定義,電腦程式會有以下 2 個重要的元素:

      1. 程式輸入參數(Program Parameter):這是電腦程式從 command line 獲取的其中一個輸入(input)
      2. 程式輸出(Return):這是電腦程式告訴 command line 執行的結果

      因此,我們以下會集中討論 Python 與程式輸入參數和程式輸出的關係。

      前提:使用 VS Code

      以下的示範我們會使用 VS Code。如果您不知道如何使用 VS Code,可以參考這裡:

      程式輸入參數:使用 sys.argv

      在我們研究一個例子以前,我們先來學習一個新的 Python 語法:sys.argv

      如上面提及,程式輸入參數(program parameter)是電腦程式獲取執行輸入(input)的重要一環。

      我是廣告 ^o^

      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 個的子項。

      我是廣告 ^o^

      由此可見,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 提供的這三個數字,得知我們希望用於計算的數字輸入。

      我是廣告 ^o^

      稍作改良

      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)嗎?

      我是廣告 ^o^

      元組在 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 結束狀況回傳。

      我是廣告 ^o^

      人氣文章

      快讓我學更多

      small_c_popup.png
      想學習 Python 嗎?
      快來訂閱我們的電子報!