Python2:使用Popen.communicate()写入交互式进程的标准输入,不带尾随换行符

我试图编写我认为是一个简单的实用程序脚本来调用不同的命令,但Popen.communicate()似乎附加一个换行符 . 我想这是终止输入,它使用一个基本脚本,它接受输入并将其打印出来,但是当其他程序是交互式的时(例如 bc ),它会引起问题 .

使用bc代替其他程序重现的最小代码(因为两者都是交互式的,让它与bc一起工作应该可以解决问题):

#!/usr/bin/env python
from subprocess import Popen, PIPE

command = "bc"
p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout_data = p.communicate(input="2+2")
print(stdout_data)

这打印 ('', '(standard_in) 1: syntax error\n') ,可能是由附加的换行符引起的,因为在shell中将相同的字符串连接到bc, echo "2+2" | bc ,打印 4 就好了 .

是否可以在不附加换行符的情况下使用Popen.communicate(),还是需要使用其他方法?

回答(1)

2 years ago

我想我是个白痴,因为解决方案与我的想法相反:在输入中添加换行符: stdout_data = p.communicate(input="2+2\n") 使脚本按原样打印 ('4\n', '') ,而不是给出错误 .