如何在没有通信的情况下阅读python subprocess stdout

时间:2017-07-28 14:43:26

标签: python linux python-3.x shell

我有一个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()
  

问题:什么都没打印出来。我搜索了无数个小时   在线有一个原因,多天,但似乎所有这些都没有   工作,和/或建议使用沟通(),这是我不这样做的   想做。如果我能够用a实现这个,那么在思考   socket,我不能在每个命令后关闭进程。我有   在写入之前,在读取之间,之后还尝试过冲洗   阅读,几乎无处不在。应该很简单   够了,我不必深入了解io模块或规则   缓冲(现在太晚了)。几天来我一直在努力奋斗   结束。

1 个答案:

答案 0 :(得分:0)

你有几个问题,我会试着画出这条道路,我希望我没有误导你。

首先,免责声明:执行用户输入本质上是不安全的。如果这不是问题,那就让我们继续你的问题。

我会先做

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()

但是,如果你不知道你能阅读多少行......那就是一个问题。实际上,这个具体问题是has already been asked

如果您想进行实验,只需打开交互式python解释器,发送"ls\n"命令并执行readline()。它会工作,直到你读完最后一行,然后......它将永远等待。这是不好的行为。所以你需要解决这个问题。