使用python模擬Shell交互,并解決subprocess.Popen卡死問題
許多Python開發(fā)者需要在程序中模擬Shell的交互式操作。本文將介紹如何利用subprocess模塊實(shí)現(xiàn)此功能,并重點(diǎn)解決代碼卡死問題。
問題:使用subprocess.Popen啟動(dòng)bash進(jìn)程進(jìn)行交互時(shí),程序常常卡死,無法接收后續(xù)輸入。
原因分析:根本原因在于向subprocess.Popen的標(biāo)準(zhǔn)輸入寫入命令時(shí),缺少必要的換行符(n)。Shell解釋器依賴換行符來識(shí)別命令的結(jié)束。
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
解決方案:在向process.stdin寫入命令后,添加換行符,并使用process.stdin.flush()立即刷新緩沖區(qū),確保數(shù)據(jù)及時(shí)寫入管道。
改進(jìn)后的代碼:
import subprocess process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: cmd = input("$ ") if cmd == "exit": break cmd_bytes = (cmd + 'n').encode('utf-8') # 添加換行符并編碼 process.stdin.write(cmd_bytes) process.stdin.flush() # 立即刷新緩沖區(qū) output = process.stdout.readline().decode('utf-8') print(output.strip()) process.stdin.close() process.wait() # 等待子進(jìn)程結(jié)束
通過添加換行符和刷新緩沖區(qū),解決了Shell進(jìn)程無法識(shí)別命令結(jié)束的問題,從而避免了程序卡死。 process.stdin.close()和process.wait()確保了程序的完整性和資源的正確釋放。 這個(gè)改進(jìn)后的代碼能夠流暢地進(jìn)行Shell交互,支持多條命令輸入并接收輸出。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END