繁体   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