簡體   English   中英

如何在不通信的情況下讀取python子進程標准輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM