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

更新於 2024/10/12閱讀時間約 9 分鐘

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 識別的文字
raw-image

這裡,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)
raw-image

這段程式碼會直接將 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:存儲命令的標準錯誤。
raw-image
avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
OpenCV 支援讀取和保存 TIFF(Tagged Image File Format)檔案,但對於合併多張圖片成為多頁的 TIFF 檔案,OpenCV 沒有的這功能。 可以使用 Pillow 庫(Python Imaging Library, PIL 的分支)來實現。
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
from win32com.client import Dispatch path = "D:\PROGRAMMING\PythonCode\pypptx\image1.png" # 启动PowerPoint应用程序 ppt = Dispatch('PowerPoint.Applicatio
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
from win32com.client import Dispatch path = "D:\PROGRAMMING\PythonCode\pypptx\image1.png" # 启动PowerPoint应用程序 ppt = Dispatch('PowerPoint.Applicatio
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。