[Python:os.system,subprocess] 執行程式和系統命令 - 全面指南

簡介

在自動化驅動的世界中,能夠控制系統級別的命令可以節省時間和精力。多功能的語言 Python 提供了多種執行系統命令和運行外部程式的方法。本指南將著重介紹使用 os.systemos.popensubprocess 模組,以精確控制系統級別的互動。

使用 os.system

os.system 命令允許我們直接執行 shell 命令。

python
import os

exit_code = os.system('echo Hello, World!')
print("Exit code:", exit_code)

輸出

Hello, World!
Exit code: 0

在上面的示例中,我們使用 os.system 呼叫了 echo 命令。退出碼提供了有關操作成功與否的信息。

使用 os.popen

os.popen 函式允許您在子 shell 中運行命令,並提供了用於讀取或寫入的文件接口。

python
import os

file = os.popen('echo Hello, World!', 'r')
output = file.read()
print("Output:", output)
file.close()

輸出

Output: Hello, World!

此程式段展示了如何使用 os.popen 將命令的輸出讀取到變數中。

使用 subprocess.Popen

subprocess 模組提供了對命令執行過程的更多控制。使用 subprocess.Popen,您可以執行命令,檢索其輸出並更靈活地管理進程。

python
import subprocess

process = subprocess.Popen(['echo', 'Hello, World!'], stdout=subprocess.PIPE)
output, error = process.communicate()
print("Output:", output.decode())

輸出

Output: Hello, World!

在這裡,使用 subprocess.Popen 執行了 echo 命令,並捕獲了輸出以供進一步處理。

subprocess.call 和 subprocess.run

subprocess.callsubprocess.run 都是方便的運行 shell 命令的方式。以下是演示其使用方法的範例。

python
# 使用 subprocess.call
exit_code = subprocess.call(['echo', 'Using call'])
print("Exit code using call:", exit_code)

# 使用 subprocess.run
result = subprocess.run(['echo', 'Using run'], stdout=subprocess.PIPE)
print("Output using run:", result.stdout.decode())

輸出

Using call
Exit code using call: 0
Using run
Output using run: Using run

這些方法使命令更容易執行,subprocess.run 在 Python 3.5 及以上版本中提供了更多功能。


執行系統命令並運行外部程式是許多自動化和整合任務的重要部分。Python 通過 ossubprocess 等模組的靈活性使這些任務更易於實現並易於維護。您可以根據應用程序的特定需求選擇 os.systemos.popen 或更強大的 subprocess 方法。通過嘗試這些示例,您將能夠理解其功能並應用於您的項目中。


常見問題

  1. os.systemsubprocess 之間的主要區別是什麼? os.system 較簡單,但提供較少的控制;而 subprocess 提供更多功能和對進程的控制。
  2. 我能夠使用這些方法捕獲錯誤訊息嗎? 是的,subprocess.Popensubprocess.run 允許捕獲標準輸出和標準錯誤串流。
  3. 使用這種方法執行命令安全嗎? 應該注意避免代碼注入和其他安全風險,特別是如果命令包含使用者輸入。
  4. 如果我需要按順序運行多個命令怎麼辦? 您可以在循環中使用這些方法,或者在單個呼叫中使用 shell 語法鏈接命令。
  5. 這些方法是否與平台無關? 雖然通常是與平台無關的,但某些特定的 shell 命令可能無法在所有操作系統上運作。最好在目標平台上進行測試。
© Copyright 2023 CLONE CODING