Python中的Popen函數(shù)demo演示
1. 基本知識(shí)
在Python中,Popen 是 subprocess 模塊中的一個(gè)函數(shù),它用于創(chuàng)建一個(gè)子進(jìn)程并與其進(jìn)行通信
subprocess.Popen()
:Popen 類用于創(chuàng)建和管理子進(jìn)程
與 os.system() 或 os.popen() 相比,Popen 提供了更多的靈活性,如讀取子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤
參數(shù)說(shuō)明:
exe_path: 要執(zhí)行的可執(zhí)行文件或命令
stderr=PIPE:將子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤重定向到管道,以便父進(jìn)程可以捕獲
stdout=PIPE:(可選)可以重定向標(biāo)準(zhǔn)輸出
exe.communicate()
:
communicate() 用于與子進(jìn)程進(jìn)行交互。它會(huì)等待子進(jìn)程完成執(zhí)行,并返回一個(gè)包含標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的元組
調(diào)用 communicate() 后,子進(jìn)程的輸入輸出流會(huì)被關(guān)閉
stderr 和 stdout
:
stderr:記錄子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出,通常包含執(zhí)行過(guò)程中遇到的錯(cuò)誤信息
stdout: 包含子進(jìn)程的標(biāo)準(zhǔn)輸出,即執(zhí)行命令后的結(jié)果
具體調(diào)用方式:
import subprocess # 示例: 使用 Popen 打開(kāi)一個(gè)子進(jìn)程執(zhí)行 exe exe_path = "path_to_executable.exe" # 替換為實(shí)際的可執(zhí)行文件路徑 exe = subprocess.Popen(exe_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 與子進(jìn)程交互并等待其完成 stdout, stderr = exe.communicate() # 打印標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出 print("Standard Output:", stdout.decode('utf-8')) print("Standard Error:", stderr.decode('utf-8'))
1.啟動(dòng)子進(jìn)程:使用 Popen 啟動(dòng)指定的可執(zhí)行文件 exe_path
此過(guò)程在后臺(tái)運(yùn)行,父進(jìn)程不會(huì)被阻塞
2.捕獲輸出:通過(guò) stderr=PIPE 參數(shù),可以捕獲子進(jìn)程的錯(cuò)誤信息
可以同時(shí)捕獲 stdout=PIPE 來(lái)獲取執(zhí)行的結(jié)果
3.處理子進(jìn)程的結(jié)果: 調(diào)用 communicate(),該方法會(huì)阻塞,直到子進(jìn)程完成運(yùn)行
返回的 stdout 和 stderr 是字節(jié)流,因此需要通過(guò) decode(‘utf-8’) 將其轉(zhuǎn)換為字符串
2. Demo
假設(shè)有一個(gè)簡(jiǎn)單的可執(zhí)行文件 example.exe,可以如下調(diào)用:
import subprocess # 可執(zhí)行文件路徑 exe_path = "example.exe" # 啟動(dòng)子進(jìn)程,捕獲標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤 exe = subprocess.Popen([exe_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 與子進(jìn)程交互 stdout, stderr = exe.communicate() # 打印輸出和錯(cuò)誤 if stdout: print("Standard Output:", stdout.decode('utf-8')) if stderr: print("Standard Error:", stderr.decode('utf-8'))
常見(jiàn)問(wèn)題
- 子進(jìn)程卡住:如果子進(jìn)程產(chǎn)生了大量輸出且沒(méi)有及時(shí)處理,管道可能會(huì)被填滿,導(dǎo)致子進(jìn)程掛起
這種情況下,可以考慮手動(dòng)讀取流
- 捕獲實(shí)時(shí)輸出:如果需要實(shí)時(shí)讀取子進(jìn)程的輸出而不是等到 communicate() 返回,可以循環(huán)讀取 stdout
到此這篇關(guān)于Python中的Popen函數(shù)的文章就介紹到這了,更多相關(guān)Python Popen函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python基礎(chǔ)教程之popen函數(shù)操作其它程序的輸入和輸出示例
- Python?subprocess.Popen?實(shí)時(shí)輸出?stdout的解決方法(正確管道寫法)
- Python調(diào)用系統(tǒng)命令的四種方法詳解(os.system、os.popen、commands、subprocess)
- Python調(diào)用系統(tǒng)命令os.system()和os.popen()的實(shí)現(xiàn)
- 解決python3中os.popen()出錯(cuò)的問(wèn)題
- python中的subprocess.Popen()使用詳解
- 對(duì)Python subprocess.Popen子進(jìn)程管道阻塞詳解
相關(guān)文章
PyCharm如何設(shè)置新建文件默認(rèn)為L(zhǎng)F換行符
這篇文章主要介紹了PyCharm如何設(shè)置新建文件默認(rèn)為L(zhǎng)F換行符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Django如何判斷訪問(wèn)來(lái)源是PC端還是手機(jī)端
這篇文章主要介紹了Django如何判斷訪問(wèn)來(lái)源是PC端還是手機(jī)端問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05詳解selenium + chromedriver 被反爬的解決方法
這篇文章主要介紹了詳解selenium + chromedriver 被反爬的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容
這篇文章介紹的是利用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容,注意本文用的是python3版本以及根據(jù)關(guān)鍵詞爬取,爬取也只是單純的爬網(wǎng)頁(yè)信息,有需要的可以參考借鑒。2016-08-08Python系統(tǒng)公網(wǎng)私網(wǎng)流量監(jiān)控實(shí)現(xiàn)流程
這篇文章主要介紹了Python系統(tǒng)公網(wǎng)私網(wǎng)流量監(jiān)控實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11python 竊取攝像頭照片的實(shí)現(xiàn)示例
這篇文章主要介紹了python:竊取攝像頭照片的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python編程快速上手——正則表達(dá)式查找功能案例分析
這篇文章主要介紹了Python正則表達(dá)式查找功能,結(jié)合具體實(shí)例形式分析了Python基于正則表達(dá)式遍歷查找指定格式文件的相關(guān)操作技巧,需要的朋友可以參考下2020-02-02