Pygame与cx_freeze:段错误

2 投票
5 回答
2252 浏览
提问于 2025-04-16 15:54

我在使用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 个回答

0

你有没有在网上搜索一下你的错误信息(http://www.google.com/search?&q=Fatal%20Python%20error%3A%20%28pygame%20parachute%29%20Segmentation%20Fault),看看有没有其他人也遇到过同样的问题?

比如说:

0

你在冻结脚本的时候,有没有设置什么优化选项?我不太确定是不是这样,但可能是它错误地把一个变量改成了引用。再说一次,我对cx_freeze不是很专业,但我觉得解决办法是更新一下。你有最新版本的cx_freeze吗?

1

我在使用 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 字符串。

撰写回答