Python中如何模擬Shell交互避免命令執行卡死?

Python中如何模擬Shell交互避免命令執行卡死?

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