python模擬Shell交互,避免命令執行卡死
本文介紹如何利用Python的subprocess模塊模擬Shell交互式操作,解決subprocess.Popen導致命令執行卡死的問題。
許多Python開發者希望在程序中實現與Shell類似的交互體驗,例如執行一系列命令并實時獲取反饋。然而,直接使用subprocess.Popen循環輸入命令,常常導致程序阻塞。根本原因在于Shell命令輸入處理不當。
一些初始代碼嘗試通過subprocess.Popen啟動bash進程,然后循環讀取用戶輸入并發送命令。然而,這些代碼通常忽略一個關鍵步驟:在發送命令后未添加換行符。Shell解釋器需要換行符來識別命令的結束。
立即學習“Python免費學習筆記(深入)”;
改進后的代碼在發送命令前添加了換行符b’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 = cmd.encode('utf-8') + b'n' print('cmd:', cmd) # 添加了冒號,更清晰 process.stdin.write(cmd) process.stdin.flush() output = process.stdout.readline().decode('utf-8') print(output.strip()) process.stdin.close() # 添加了關閉stdin,確保進程正常結束 process.wait() # 等待子進程結束
通過在cmd后添加b’n’,確保每個命令都被正確發送到bash進程并執行,從而實現與Shell類似的交互式操作。 這有效地解決了程序卡死的問題,允許用戶在python程序中與bash進行多次交互。 此外,我們還添加了process.stdin.close()和process.wait()來確保子進程的正確關閉和等待,提高程序的健壯性。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END