Python2:使用Popen.communicate()编写交互式过程的stdin,而无需尾随换行符

时间:2018-12-10 11:50:00

标签: python stdin

我正在尝试编写我认为简单的实用程序脚本来调用不同的命令,但是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'),可能是由附加的换行符引起的,因为将相同的字符串用管道输送到外壳程序中的bc echo "2+2" | bc时,打印4很好。

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

1 个答案:

答案 0 :(得分:1)

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