Python模擬Shell交互:如何解決subprocess.Popen卡死問題?

Python模擬Shell交互:如何解決subprocess.Popen卡死問題?

使用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
喜歡就支持一下吧
點贊5 分享