subprocess.run()
是 Python 3.5 之後引入的一個簡單且強大的函數,用來執行系統命令並等待命令完成。它是 subprocess
模組的高階 API,封裝了低階的 Popen()
,提供了更簡便的方式來執行命令、捕獲輸出、處理錯誤等操作。
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
中。
如果希望將 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 中處理該結果。
Tesseract 支援多種語言識別,你可以使用 -l
參數來指定要識別的語言。假設你要識別中文(chi_sim
),可以這樣做:
# 指定語言參數進行 OCR
subprocess.run(['tesseract', 'image.png', 'output', '-l', 'chi_sim'], capture_output=True, text=True)
這會讓 Tesseract 使用chi_sim
進行 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)
args
args
是你要傳入的命令或程序及其參數。它可以是列表或字符串
,取決於 shell
參數如何設置,預設是shell
=False。
subprocess.run(['ls', '-l'])列表中的每一項都對應一個命令或參數。這樣的方式會避免命令被解析成單個字符串,從而提高安全性。
shell=True
時,可以直接用字符串形式來執行命令:subprocess.run('ls -l', shell=True)
shell=False
時,args
通常以 列表 形式傳入,每個命令和參數分別作為一個列表元素。shell=True
時,args
可以以 字符串 形式傳入,讓整個命令交由 shell 解釋。stdin
, stdout
, stderr
這三個參數用來控制標準輸入、標準輸出和標準錯誤的處理方式。它們可以設置為以下值:
None
(預設):輸出直接顯示在當前的終端中。PIPE
:將輸入或輸出捕獲到變量中,後續可用來進行處理。capture_output=True 與 text=True
capture_output=True
參數的作用是告訴 Python 將外部程序的 標準輸出(stdout)和 標準錯誤(stderr)捕獲起來,以便你在 Python 程序中進行處理。當這個參數設置為 True
時,輸出將不會顯示在終端或控制台上,而是會存儲在返回的 CompletedProcess
對象中,並可以通過 stdout
和 stderr
來訪問。
text=True
text=True
參數告訴 subprocess.run()
,要將捕獲到的 輸出(stdout) 和 錯誤(stderr) 轉換為 字符串(string),而不是原始的 字節串(bytes)。
text=False
(或省略這個參數)時,stdout
和 stderr
的輸出會是 位元資料(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
:存儲命令的標準錯誤。text=True
,輸出會是位元資料,你需要手動解碼。print(result.stderr)
print('----------------')
print(result.stderr.decode('utf-8'))