[英]Python subprocess Popen.communicate() equivalent to Popen.stdout.read()?
[英]How to read python subprocess stdout without communicate
我有一個python 3腳本,可以接受來自用戶的輸入,此輸入通過管道傳遞到子進程中,在該子進程中已經生成了shell。 最初,我打算將此代碼與套接字放在一起,以便能夠制作自己的非嚴肅的遠程管理工具,但是,這對於我目前的水平來說太難了。 碼:
import subprocess
p1 = subprocess.Popen(["/bin/sh"], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf-8")
command = input("Command: ")
p1.stdin.write(command)
p1.stdout.read()
問題:什么都沒有打印出來。 我已經在網上搜索了無數小時,這是有原因的,已經過了好幾天,但是所有這些似乎都不起作用,並且/或者建議使用communication(),這是我不想做的事情。 在考慮是否可以使用套接字實現此功能時,無法在每個命令之后關閉進程。 我還嘗試過在所有位置(在寫入之前,在讀取之間,在讀取之后)在所有您能想到的地方都進行刷新。 它應該足夠簡單,而無需我深入研究io模塊或緩沖規則(現在為時已晚)。 我已經為此苦苦掙扎了好幾天了。
您有幾個問題,我會盡力而為,希望我不會誤導您。
首先,免責聲明:執行用戶輸入本質上是不安全的。 如果這不是問題,讓我們繼續解決您的問題。
我會先做
p1 = subprocess.Popen(["/bin/sh"], stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, bufsize=1)
在這種情況下,使用行緩沖的PIPE是一個好主意。
然后,請記住您必須在命令后按Enter鍵,因此:
command = input("Command: ") + "\n"
寫的是正確的,
p1.stdin.write(command)
但是,讀操作非常危險,您將陷入僵局。 因為stdout
是打開的(沒有EOF或類似的東西),所以您應該保守地閱讀,但仍然會有問題。
第一個想法是讀取以下行:
p1.stdout.readline()
但是,如果您不知道可以閱讀多少行,那就是一個問題。 實際上, 已經提出了該特定問題。
如果您想嘗試,只需打開一個交互式python解釋器,發送"ls\\n"
命令並執行readline()
。 它會起作用,直到您讀完最后一行,然后……它將永遠等待。 這是不良行為。 因此,您需要解決該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.