Pygame与cx_freeze:段错误
我在使用Ubuntu和Python 2.6。
我发现系统上已经安装了cx freeze(有没有办法检查它是否和我的Python版本兼容?)
不过,我有一个小的pygame脚本(它导入了另一个模块和一些图片),我想把它编译成可执行文件;
我用这个文件作为setup.py:
#!/usr/bin/python
from cx_Freeze import setup, Executable
setup(
name = 'Example',
version = '0.1',
description='hi',
executables = [Executable('/home/antonio/Python 26 save/opt/example.py')]
)
如果我通过终端运行生成的可执行文件,我会遇到这个错误:
Fatal Python error: (pygame parachute) Segmentation Fault
Aborted
我该怎么办?我搜索了一下,但找到的例子很少,而且在谷歌搜索结果中没有看到这个错误。
顺便说一下,当然在使用cx freeze之前,程序运行得很好。
5 个回答
你有没有在网上搜索一下你的错误信息(http://www.google.com/search?&q=Fatal%20Python%20error%3A%20%28pygame%20parachute%29%20Segmentation%20Fault),看看有没有其他人也遇到过同样的问题?
比如说:
你在冻结脚本的时候,有没有设置什么优化选项?我不太确定是不是这样,但可能是它错误地把一个变量改成了引用。再说一次,我对cx_freeze不是很专业,但我觉得解决办法是更新一下。你有最新版本的cx_freeze吗?
我在使用 Python 2.7 的时候遇到了类似的问题。我发现了我自己程序中导致这个“段错误”的两个原因,但我只有一个解决办法。
原因一:初始化字体时没有提供路径,也就是调用:
pygame.font.Font(None, font_size)
在这种情况下,valgrind 报告在地址 0x0 处发生了无效读取,出现在 pygame.font.so
中。
我猜这是因为 None 被转换成了一个空指针,然后某个地方假设这个空指针是一个有效的字符串。
解决这个问题的方法是始终提供一个有效的字体路径。
原因二:在字体中渲染 Unicode 字符
pygame.font.Font("data/DejaVuSans.ttf", 14).render(u'\u2654')
valgrind 报告在 libpython2.7.so.1.0 中的 PyString_AsString 发生了无效读取。
很抱歉,我没有这个问题的解决办法。
附注:我刚刚发现了另一个与 Unicode 相关(但与 pygame 无关)的 cxfreeze 问题。
print u'\u2654'
在 Python 解释器中可以打印出一个国王(棋子),但当我用 cxfreeze 编译脚本时,我得到了以下错误(不是段错误):
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2654' in position 0: ordinal not in range(128)
如果你调用:
print str(u'\u2654')
在 Python 解释器中也会出现这个错误。
这似乎表明 cxfreeze 假设字符串总是 ASCII 字符串。