2024-10-12|閱讀時間 ‧ 約 0 分鐘

[Python]在 Python 中執行外部命令或可執行文件

subprocess.run() 是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess 模組的高階 API,封裝了低階的 Popen(),提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。


先用Python 調用 Tesseract OCR來帶入了解,subprocess.run()如何使用


你可以使用 subprocess.run() 調用 tesseract 來處理圖像。假設你有一個名為 image.png 的圖像文件,並希望使用 Tesseract 將圖像中的文字提取到 output.txt 文件中。

import subprocess

# 調用 Tesseract 進行 OCR,將結果輸出到文本文件
subprocess.run(['tesseract', 'image.png', 'output'], capture_output=True, text=True)

# Tesseract 會生成一個名為 'output.txt' 的文件,該文件包含 OCR 識別的文字

這裡,tesseract 的基本語法是:

tesseract <input_image> <output_base_name> [options]

這樣就能夠調用 Tesseract 進行 OCR 並將結果保存到 output.txt 中。

4. 獲取結果到 Python 變數

如果希望將 Tesseract 的輸出直接返回到 Python 變數,而不寫入文件中,可以使用 Tesseract 的標準輸出選項 stdout

import subprocess

# 調用 Tesseract 並將結果捕獲到變量
result = subprocess.run(['tesseract', 'image.png', 'stdout'], capture_output=True, text=True)

# 輸出 OCR 結果
print(result.stdout)

這段程式碼會直接將 Tesseract 的輸出結果(識別出的文字)寫到到 result.stdout,並且可以立即在 Python 中處理該結果。

5. 設定語言

Tesseract 支援多種語言識別,你可以使用 -l 參數來指定要識別的語言。假設你要識別中文(chi_sim),可以這樣做:

​# 指定語言參數進行 OCR
subprocess.run(['tesseract', 'image.png', 'output', '-l', 'chi_sim'], capture_output=True, text=True)

這會讓 Tesseract 使用chi_sim進行 OCR 識別。

6. 使用配置參數調整 OCR 行為

Tesseract 提供了許多配置選項,可以通過命令行傳遞來調整 OCR 行為。例如,如果你需要更好地處理噪音圖像,可以使用一些 Tesseract 提供的參數進行優化。

# 使用 Tesseract 配置參數
subprocess.run(['tesseract', 'image.png', 'output', '--psm', '6'], capture_output=True, text=True)

這裡的 --psm 參數用於設置頁面分段模式(PSM,Page Segmentation Mode),例如 6 表示完全單一的文本塊。


subprocess.run() 的詳細分解

調用外部應用程式

當你用 subprocess.run() 調用 tesseract 時,系統會在環境變數中查找 Tesseract,然後執行它。你可以向 tesseract 傳遞命令行參數,如圖像文件名、輸出文件名、語言設置等,這些參數會被傳遞給 Tesseract 的可執行文件來進行處理。

例如,這一行代碼:

subprocess.run(['tesseract', 'image.png', 'output', '-l', 'chi_sim'], capture_output=True, text=True)
  • 'tesseract': 系統會從 PATH 中查找 Tesseract 的可執行文件並啟動它。
  • 'image.png': 這是你要進行 OCR 處理的圖像。
  • 'output': 這是輸出文件的基礎名稱,Tesseract 會將結果寫入 output.txt
  • '-l', 'chi_sim': 這些是命令行參數,指定 Tesseract 使用chi_sim進行 OCR。


以下是對 subprocess.run() 函數的詳細介紹和參數說明:

函數

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

1. args

args 是你要傳入的命令或程序及其參數。它可以是列表或字符串,取決於 shell 參數如何設置,預設是shell=False。

  • 列表形式(推薦):
    subprocess.run(['ls', '-l'])
    列表中的每一項都對應一個命令或參數。這樣的方式會避免命令被解析成單個字符串,從而提高安全性。
  • 字符串形式: 當 shell=True 時,可以直接用字符串形式來執行命令:
    subprocess.run('ls -l', shell=True)
  • shell=False 時,args 通常以 列表 形式傳入,每個命令和參數分別作為一個列表元素。
  • shell=True 時,args 可以以 字符串 形式傳入,讓整個命令交由 shell 解釋。


2. stdin, stdout, stderr

這三個參數用來控制標準輸入、標準輸出和標準錯誤的處理方式。它們可以設置為以下值:

  • None(預設):輸出直接顯示在當前的終端中。
  • PIPE:將輸入或輸出捕獲到變量中,後續可用來進行處理。


3. capture_output=True 與 text=True



capture_output=True 參數的作用是告訴 Python 將外部程序的 標準輸出(stdout)和 標準錯誤(stderr)捕獲起來,以便你在 Python 程序中進行處理。當這個參數設置為 True 時,輸出將不會顯示在終端或控制台上,而是會存儲在返回的 CompletedProcess 對象中,並可以通過 stdoutstderr 來訪問。


text=True

text=True 參數告訴 subprocess.run(),要將捕獲到的 輸出(stdout)錯誤(stderr) 轉換為 字符串(string),而不是原始的 字節串(bytes)

  • text=False(或省略這個參數)時,stdoutstderr 的輸出會是 位元資料(bytes),這是默認行為。
  • text=True 時,這些位元資料會被自動解碼為 字串(string) 格式,這樣可以更方便處理。


範例

import subprocess

# 調用 Tesseract 進行 OCR,將結果輸出到文本文件
result = subprocess.run(['tesseract', r'', 'output', '-l', 'eng', '--psm', '6'], capture_output=True, text=True)

# 顯示標準錯誤 (stderr)
print(result.stderr)
  • result.stdout:存儲命令的標準輸出。
  • result.stderr:存儲命令的標準錯誤。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.