在线程内使用shoutpython时出现segfault

2024-04-26 17:26:25 发布

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

最近,一台机器从一个较旧的Ubuntu版本升级/重新安装到了最新的Debian版本。从那以后,我在我编写的一个应用程序中得到了一个segfault,它将数据发送到一个icecast守护进程。你知道吗

经过一番搜索,我把重点放在线程上。只要我从内的线程调用shout.send,就会得到一个segfault。下面是一段复制错误的最小代码。你知道吗

错误发生在最后的第二行(icy_handle.send(chunk)

我在跑步:

  • Python 2.7版
  • 呼出python==0.2.1
  • Debian 8.0版
  • Linux 3.16.0-4-amd64#1 SMP Debian 3.16.7-ckt2-1(2014-12-08)x86Š64 GNU/Linux

老实说,我有点难堪。经过大约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()

Tags: importselfsendsizeubuntusysdebianfilename
1条回答
网友
1楼 · 发布于 2024-04-26 17:26:25

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

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

我很确定这是相关的解决方案:

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

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

相关问题 更多 >