![](/img/trans.png)
[英]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.