Python子进程PIPE,适用于Python 2但不适用于Python 3

时间:2018-03-23 03:37:44

标签: python python-3.x subprocess

我试图用Python中的子进程控制软件MIDI合成器Timidity++。我这样做的方法是在其Ncurses UI中启动一个Timidity ++进程,然后将命令传递给子进程的STDIN。这样我就可以实时控制播放,例如调整键。

问题是这种方法似乎适用于Python 2(特别是Python 2.7.13),但不适用于Python 3(特别是Python 3.5.3)。原因是什么?我在Raspbian 9上测试了这个。

我的代码如下:

from subprocess import *
import time
a = Popen(["timidity", "-in", "MIDI_sample.mid"], stdin=PIPE, stdout=PIPE)
time.sleep(4)
a.stdin.write(b"+")
time.sleep(4)
a.stdin.write(b"s")
time.sleep(4)
a.stdin.write(b"s")
time.sleep(4)
a.stdin.write(b"q")

这似乎在Python 2上运行良好,即您可以听到播放,暂停和取消暂停以及键调整。在Python 3上,它只播放MIDI文件,直到程序终止。

1 个答案:

答案 0 :(得分:0)

正如戴维斯在上述评论中所指出的,刷新a.stdin解决了这个问题。所以下面的代码适用于Python 2和3:

from subprocess import *
import time
a = Popen(["timidity", "-in", "MIDI_sample.mid"], stdin=PIPE, stdout=PIPE)
time.sleep(4)
a.stdin.write(b"+")
a.stdin.flush()
time.sleep(4)
a.stdin.write(b"s")
a.stdin.flush()
time.sleep(4)
a.stdin.write(b"s")
a.stdin.flush()
time.sleep(4)
a.stdin.write(b"q")
a.stdin.flush()