在线程内使用 shout-python 时出现段错误

segfault when using shout-python inside a thread

最近一台机器 upgraded/reinstalled 从旧的 Ubuntu 版本升级到最新的 Debian 版本。从那时起,我编写的一个应用程序出现段错误,该应用程序将数据发送到 icecast 守护进程。

经过一番搜索,我将其重点放在线程上。一旦我从线程 中的 调用 shout.send,就会出现段错误。下面是重现错误的最小代码。

错误发生在倒数第二行(icy_handle.send(chunk))

我是运行:

老实说,我有点难过。经过大约 4 个小时的碰碰运气后,我失去了主意。我还没有尝试设置代表旧 Ubuntu 环境的旧机器。我也不记得确切的 Ubuntu 版本。我 认为 是 12.04,但我不确定。但是我确实知道它在那个系统上是运行。顺便说一句:硬件没有变化!

有什么想法吗?

示例代码:

from threading import Thread

import shout


class Player(Thread):

    def __init__(self, filename, *args, **kwargs):
        super(Player, self).__init__(*args, **kwargs)
        self.filename = filename

    def run(self):
        icy_handle = shout.Shout()
        icy_handle.format = 'mp3'
        icy_handle.audio_info = {
            "bitrate": str(128),
            "samplerate": str(44100),
            "channels": str(1)}
        icy_handle.user = "source"
        icy_handle.name = "test stream"
        icy_handle.url = "http://stream.example.com"
        icy_handle.password = "password123"
        icy_handle.mount = "/test.mp3"
        icy_handle.port = 8000
        icy_handle.open()

        chunk_size = 1024
        with open(self.filename, 'rb') as afile:
            chunk = afile.read(chunk_size)
            while chunk:
                icy_handle.send(chunk)
                icy_handle.sync()
                chunk = afile.read(chunk_size)


if __name__ == "__main__":
    import sys

    if len(sys.argv) < 2:
        print """
        USAGE: %s <filename>
        """ % sys.argv[0]
        sys.exit(1)

    p = Player(sys.argv[1])
    p.start()
    p.join()

我可以用 0.2.1 重现你的问题,但不能用 trunk。 请尝试:

 svn co https://svn.xiph.org/icecast/trunk/shout-python

我很确定这是相关的修复:

https://trac.xiph.org/changeset/19174

我们应该发布一个新版本。让我开始吧。 (JFTR,这将涉及我将存储库从 SVN 迁移到 git,因此上面的 URL 在这个特定范围之外变得无效)