在线程内使用 shout-python 时出现段错误
segfault when using shout-python inside a thread
最近一台机器 upgraded/reinstalled 从旧的 Ubuntu 版本升级到最新的 Debian 版本。从那时起,我编写的一个应用程序出现段错误,该应用程序将数据发送到 icecast 守护进程。
经过一番搜索,我将其重点放在线程上。一旦我从线程 中的 调用 shout.send
,就会出现段错误。下面是重现错误的最小代码。
错误发生在倒数第二行(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()
我可以用 0.2.1 重现你的问题,但不能用 trunk。
请尝试:
svn co https://svn.xiph.org/icecast/trunk/shout-python
我很确定这是相关的修复:
https://trac.xiph.org/changeset/19174
我们应该发布一个新版本。让我开始吧。 (JFTR,这将涉及我将存储库从 SVN 迁移到 git,因此上面的 URL 在这个特定范围之外变得无效)
最近一台机器 upgraded/reinstalled 从旧的 Ubuntu 版本升级到最新的 Debian 版本。从那时起,我编写的一个应用程序出现段错误,该应用程序将数据发送到 icecast 守护进程。
经过一番搜索,我将其重点放在线程上。一旦我从线程 中的 调用 shout.send
,就会出现段错误。下面是重现错误的最小代码。
错误发生在倒数第二行(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()
我可以用 0.2.1 重现你的问题,但不能用 trunk。 请尝试:
svn co https://svn.xiph.org/icecast/trunk/shout-python
我很确定这是相关的修复:
https://trac.xiph.org/changeset/19174
我们应该发布一个新版本。让我开始吧。 (JFTR,这将涉及我将存储库从 SVN 迁移到 git,因此上面的 URL 在这个特定范围之外变得无效)