【问题标题】:Python 3 Subprocess.stdin.write does not work | omxplayer classPython 3 Subprocess.stdin.write 不起作用 | omxplayer 类
【发布时间】:2018-02-27 11:16:49
【问题描述】:

对于我的一个项目,我需要一种方法来创建自定义媒体播放器类。为此,我创建了一个简单的类,该类使用给定的 url 调用 omxplayer 并写入标准输入字母,例如“p”暂停,“q”退出……等等 这是我的代码

import subprocess
import time

class MediaPlayer():
        def __init__(self):
                self.url = None
                self.process = None
        def play(self, url):
                self.url = url
                self.process = subprocess.Popen(['omxplayer', '-o', 'local', self.url], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
        def stop(self):
                self.process.stdin.write('q'.encode())
        def toogle_pause(self):
                self.process.stdin.write(b'p')

url = "/home/pi/Desktop/IOS MIRROR/films/Game.of.Thrones.S01E02.HDTV.VF.avi"

print('start')
media_player = MediaPlayer()
media_player.play(url)
time.sleep(15)
print('pause')
media_player.toogle_pause()
time.sleep(2)
print('resume')
media_player.toogle_pause()
time.sleep(10)
print('stop')
media_player.stop()

当我执行命令时,这在 python2.7 上运行良好

python omx.py

但是一旦我执行命令

python3 omx.py

我的写行都不起作用,视频播放但不会暂停和停止。没有打印错误,所以我真的被卡住了。 有关信息,我使用的是由 Raspbian 提供支持的 Raspberry Pi 3。 我需要它在 python3 上工作,因为我的 Mirror 项目正在使用 Python3

感谢大家的回答! 最好的问候,朱利安

【问题讨论】:

  • 可能您正在写入外部程序的数据正在被行缓冲。每次写入后尝试self.process.stdin.flush()
  • 哦,是的!它现在工作得很好!非常感谢,添加 flush() 方法后,一切正常!

标签: python-2.7 python-3.x subprocess stdin omxplayer


【解决方案1】:

恢复这个是因为我刚刚遇到这个问题,我不相信 jasonharper 的评论给出了完整的答案。

原因是PopenbufSize 的默认值已从python2 中的0(无缓冲)更改为python3 中的1(行缓冲)。在每次写入后调用 stdin.flush() 是一种解决方案,但可能更好的是在创建 Popen 时通过设置 bufSize=0 来明确设置它。

这应该会导致脚本在 python2 和 3 中始终如一地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多