在Python 2上工作但在Python 3上不工作的Python子进程管道

2024-09-27 23:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题是,这种方法似乎适用于Python2(特别是Python2.7.13),但不适用于Python3(特别是Python3.5.3)。原因是什么?我在Raspbian9上测试这个

我的代码如下:

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")

这在Python2上似乎工作得很好,即您可以听到播放、暂停和取消暂停以及按键调整。在python3上,它只是通过MIDI文件播放,直到程序终止


Tags: 方法import命令uitime进程stdinsleep
1条回答
网友
1楼 · 发布于 2024-09-27 23:18:15

正如Davis在上面的评论中指出的,flushinga.stdin解决了这个问题。因此,以下代码适用于Python2和Python3:

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()

相关问题 更多 >

    热门问题