子进程编写stdin和读取stdout python 3.4

时间:2016-01-15 12:00:09

标签: python python-3.x ubuntu-14.04

我正在编写一个脚本,该脚本将运行Linux命令并将字符串(最多为EOL)写入stdin并从stdout读取字符串(直到EOL)。最简单的插图是cat -命令:

p=subprocess.Popen(['cat', '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stringin="String of text\n"
p.stdin.write=(stringin)
stringout=p.stout.read()
print(stringout)

我的目标是打开cat -进程一次,并在每次从stdout获取字符串时使用它多次写入字符串。

我google了很多,很多食谱不起作用,因为语法是不兼容的不同的python版本(我使用3.4)。这是我从头开始的第一个python脚本,到目前为止我发现python文档非常混乱。

2 个答案:

答案 0 :(得分:2)

感谢您的解决方案Salva。 很遗憾communicate()关闭了cat -进程。我没有找到subprocesscat -进行通信的任何解决方案,而无需为每次通话打开新的cat -。我找到了pexpect的简单解决方案:

import pexpect

p = pexpect.spawn('cat -')
p.setecho(False)

def echoback(stringin):
    p.sendline(stringin)
    echoback = p.readline()
    return echoback.decode();

i = 1
while (i < 11):
    print(echoback("Test no: "+str(i)))
    i = i + 1

要使用pexpect Ubuntu,用户必须通过pip安装它。如果你想为python3.x安装它,你必须首先从Ubuntu repo安装pip3(python3-pip)。

答案 1 :(得分:0)

你需要communicate进程:

from subprocess import Popen, PIPE
s = Popen(['cat', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
input = b'hello!' # notice the input data are actually bytes and not text
output, errs = s.communicate(input)

要使用unicode字符串,您需要encode()输入和decode()输出:

from subprocess import Popen, PIPE
s = Popen(['cat', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
input = 'España'
output, errs = s.communicate(input.encode())
output, errs = output.decode(), errs.decode()