Python subprocess.call 用法與範例解析

本篇 ShengYu 介紹 Python subprocess.call 用法與範例,在 Python 中,有時候我們需要呼叫外部指令或腳本來完成某些任務。這時候,Python 的 subprocess 模組就派上用場了。這篇文章將詳細介紹 subprocess.call 的用途及如何在實際應用中使用它。我們將涵蓋一些基本用法及進階範例,並且比較 subprocess.callsubprocess.run 之間的區別,以便於讀者在不同情況下選擇合適的方法。

什麼是 subprocess.call

subprocess.call 是 Python 標準庫中的一個函式,用來在 Python 程式中執行外部指令或程式。這個函式會執行給定的指令並等待其完成,回傳執行指令後的退出狀態碼。

為什麼使用 subprocess.call

使用 subprocess.call 可以讓你:

  1. 執行系統指令:呼叫作業系統的指令,如列出目錄內容、移動檔案等。
  2. 腳本自動化:在 Python 腳本中執行其他腳本或程式,實現自動化流程。
  3. 呼叫外部工具:在 Python 腳本中呼叫其他語言編寫的工具或程式,擴展 Python 的功能。

subprocess.call 的基本用法

以下是一些常見的使用範例,展示如何在 Python 中使用 subprocess.call

執行簡單的系統指令

在 Unix-like 系統(如 Linux 和 macOS)中,使用 ls 指令來列出當前目錄中的檔案:

1
2
3
4
5
import subprocess

# 執行 'ls' 指令
return_code = subprocess.call(['ls'])
print(f"Command returned with code: {return_code}")

在 Windows 系統中,可以使用 dir 指令來實現相同的功能:

1
2
3
4
5
import subprocess

# 執行 'dir' 指令
return_code = subprocess.call(['cmd', '/c', 'dir'])
print(f"Command returned with code: {return_code}")

執行帶參數的指令

有時候,我們需要傳遞參數給外部指令。例如,使用 echo 指令輸出特定內容:

1
2
3
4
5
import subprocess

# 執行 'echo' 指令並輸出 'Hello, World!'
return_code = subprocess.call(['echo', 'Hello, World!'])
print(f"Command returned with code: {return_code}")

捕捉標準輸出和標準錯誤

有些情況下,我們可能需要捕捉外部指令的標準輸出和標準錯誤。這可以透過設定 stdoutstderr 參數來實現:

1
2
3
4
5
import subprocess

# 執行 'ls' 指令並捕捉其輸出
return_code = subprocess.call(['ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"Command returned with code: {return_code}")

進階應用:subprocess.run

雖然 subprocess.call 已經能夠滿足許多需求,但在 Python 3.5 之後,subprocess.run 提供了更多功能並且是 subprocess.call 的推薦替代方法。以下是一個使用 subprocess.run 的範例:

1
2
3
4
5
6
7
8
import subprocess

# 使用 subprocess.run 執行指令並捕捉輸出
result = subprocess.run(['ls'], capture_output=True, text=True)

# 輸出指令的回傳碼和輸出內容
print(f"Command returned with code: {result.returncode}")
print(f"Command output:\n{result.stdout}")

subprocess.runsubprocess.call 的差異

以下列出 subprocess.run vs subprocess.call 相似之處與不同之處,

相似之處

  • 執行外部指令:兩者都能執行外部指令。
  • 同步執行:都會等待指令完成後才繼續執行後續的 Python 程式碼。

不同之處

  • 功能豐富性subprocess.run 提供了更多功能,比如捕捉輸出(capture_output)、文字模式(text)等。
  • 回傳值subprocess.call 回傳退出狀態碼,而 subprocess.run 回傳一個 CompletedProcess 物件,包含了退出狀態碼、標準輸出、標準錯誤等資訊。

subprocess.call 跟 subprocess.Popen 的差異

subprocess.call 跟 subprocess.Popen 有什麼不一樣?
subprocess.callsubprocess.Popen 是 Python 中常用的模組,用來執行外部指令。這兩個方法有一些關鍵的不同之處,了解這些差異能幫助你更有效地使用它們。

執行方式和阻塞行為

  • subprocess.call:這是一個簡單的封裝,用來執行一個指令並等待它完成。當你使用 subprocess.call 時,當前的 Python 程式會被阻塞,直到所呼叫的指令執行完成。它的回傳值是子行程的退出狀態碼。

    範例程式碼:

    1
    2
    3
    4
    import subprocess

    retcode = subprocess.call(["ls", "-l"])
    print("Exit code:", retcode)

    在這個例子中,subprocess.call 執行了 ls -l 指令,並等待指令完成後回傳退出碼。

  • subprocess.Popen:這是一個更底層的接口,用來建立和處理子行程。使用 Popen 建立子行程後,當前程式不會自動等待子行程完成。你需要手動使用 Popenwait() 方法來等待子行程結束,或者透過其他方式來與子行程互動。Popen 回傳一個子行程物件,提供更高的控制靈活性。

    範例程式碼:

    1
    2
    3
    4
    5
    import subprocess

    process = subprocess.Popen(["ls", "-l"])
    process.wait() # 等待子行程完成
    print("Exit code:", process.returncode)

    在這個例子中,subprocess.Popen 建立了一個子行程來執行 ls -l 指令。wait() 方法會阻塞當前程式,直到子行程結束。

靈活性

  • subprocess.call:適用於簡單的指令執行,不需要與子行程進行太多互動的情況。它的用法簡單,非常適合快速執行指令並取得結果。

  • subprocess.Popen:提供了更高的靈活性和控制,可以處理標準輸入、標準輸出和標準錯誤流,設定環境變數等。這使得 Popen 適用於需要與子行程進行更多互動的複雜情況。

subprocess.call 與 subprocess.Popen 如何選擇

如果你需要執行一個指令並等待其完成,且不需要與子行程進行互動,使用 subprocess.call 是更簡單的選擇。

如果你需要更高的靈活性,或者需要與子行程進行互動,如讀取輸出、寫入輸入,或處理錯誤流,subprocess.Popen 是更合適的工具。

總結來說,subprocess.call 是執行簡單指令的便捷方法,而 subprocess.Popen 提供了更強大的功能和靈活性,適合更複雜的需求。

總結

subprocess.call 是一個強大的工具,適用於簡單的指令執行場景。如果你需要更多功能或更高的靈活性,則應該考慮使用 subprocess.run。透過這篇文章,希望你能夠對 subprocess.callsubprocess.run 有一個全面的了解,並能在實際項目中靈活運用。

以上就是 Python subprocess.call 用法與範例的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包
Python 中的 subprocess.run 完整指南與範例
Python subprocess.Popen 用法與範例
Python swap 用法與範例
如何在Python中使用SQLite:完整指南與實用範例
Python 與 MongoDB 的完美結合:詳細指南與範例