使用python模擬Shell交互,并解決subprocess.Popen卡死問題
許多Python開發(fā)者需要在程序中模擬Shell的交互式操作。本文將介紹如何利用subprocess模塊實現(xiàn)此功能,并重點解決代碼卡死問題。
問題:使用subprocess.Popen啟動bash進程進行交互時,程序常常卡死,無法接收后續(xù)輸入。
原因分析:根本原因在于向subprocess.Popen的標準輸入寫入命令時,缺少必要的換行符(n)。Shell解釋器依賴換行符來識別命令的結束。
立即學習“Python免費學習筆記(深入)”;
解決方案:在向process.stdin寫入命令后,添加換行符,并使用process.stdin.flush()立即刷新緩沖區(qū),確保數(shù)據及時寫入管道。
改進后的代碼:
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() # 等待子進程結束
通過添加換行符和刷新緩沖區(qū),解決了Shell進程無法識別命令結束的問題,從而避免了程序卡死。 process.stdin.close()和process.wait()確保了程序的完整性和資源的正確釋放。 這個改進后的代碼能夠流暢地進行Shell交互,支持多條命令輸入并接收輸出。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END