【问题标题】:Python subprocess PIPE that works on Python 2 but not on Python 3适用于 Python 2 但不适用于 Python 3 的 Python 子进程 PIPE
【发布时间】:2018-09-01 16:14:40
【问题描述】:

我正在尝试使用 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 文件,直到程序终止。

【问题讨论】:

  • 我怀疑字符串、字节和 unicode 之间存在差异,但无法放置。
  • 我一开始就是这么怀疑的。但我使用的是 b"..." 文字,它应该在 Python 2 和 3 中都给我字节。
  • 刷新a.stdin有帮助吗?
  • 确实如此!非常感谢:D

标签: python python-3.x subprocess


【解决方案1】:

正如戴维斯在上述评论中指出的那样,冲洗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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多