Python2:写入交互式进程的标准输入,使用 Popen.communicate(),没有尾随换行符
Python2: Writing to stdin of interactive process, using Popen.communicate(), without trailing newline
我正在尝试编写我认为是调用不同命令的简单实用程序脚本,但 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、echo "2+2" | bc
中将相同的字符串传递给 bc,打印 4
就好了.
是否可以在不附加换行符的情况下使用 Popen.communicate(),或者我需要使用不同的方法吗?
我想我是个白痴,因为解决方案与我的想法相反:在输入中添加换行符:stdout_data = p.communicate(input="2+2\n")
使脚本按原样打印 ('4\n', '')
,而不是比报错。
我正在尝试编写我认为是调用不同命令的简单实用程序脚本,但 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、echo "2+2" | bc
中将相同的字符串传递给 bc,打印 4
就好了.
是否可以在不附加换行符的情况下使用 Popen.communicate(),或者我需要使用不同的方法吗?
我想我是个白痴,因为解决方案与我的想法相反:在输入中添加换行符:stdout_data = p.communicate(input="2+2\n")
使脚本按原样打印 ('4\n', '')
,而不是比报错。