Pygame 和 cx_freeze:分段错误

Posted

技术标签:

【中文标题】Pygame 和 cx_freeze:分段错误【英文标题】:Pygame and cx_freeze: segmentation fault 【发布时间】:2011-04-17 13:27:33 【问题描述】:

我使用的是 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 之前程序运行良好

【问题讨论】:

我也遇到了这个问题,我访问了三个图像,然后是段错误,太奇怪了。 【参考方案1】:

我在使用 python 2.7 时遇到了类似的问题。我在自己的程序中发现了导致此分段错误的两个原因,但我只有一个解决方案。

原因1. 初始化没有路径的字体,即调用:

pygame.font.Font(None, font_size)

在这种情况下,valgrind 在 ??? 中的地址 0x0 处报告无效读取在pygame.font.so

我猜这是因为 None 被转换为 NULL 指针,然后假设它是一个有效的 const char* 字符串。

解决此问题的方法是始终提供字体的有效路径。

原因 2. 在字体中渲染 unicode 字符

pygame.font.Font("data/DejaVuSans.ttf", 14).render(u'\u2654')

valgrind 报告 libpython2.7.so.1.0 中的 PyString_AsString 读取无效

很抱歉,我没有解决方案。

PS: 我刚刚发现 cxfreeze 出现问题的另一个与 unicode 相关(但与 pygame 无关)的原因。

print u'\u2654'

在python解释器中会打印一个国王(棋子),但是当用cxfreeze编译脚本时,我得到以下错误(不是分段错误):

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2654' in position 0: ordinal not in range(128)

如果你调用,你也会在 python 解释器中得到这个错误:

print str(u'\u2654')

这似乎表明 cxfreeze 假设字符串总是 ascii 字符串。

【讨论】:

成功了!好吧,经过这么长时间,我对这个项目失去了兴趣,但仍然!谢谢;-)【参考方案2】:

冻结脚本时是否设置了任何优化选项?我不太确定它是否这样做,但可能是它错误地将变量更改为引用。同样,我不是 cx_freeze 的专家,但我的解决方案是更新。你有最新版本(cx_freeze)吗?

【讨论】:

是的,我已经下载了最新版本的 cx freeze,我没有设置任何优化选项..我只是运行'python setup.py build'【参考方案3】:

您是否在 Google 上搜索过您的错误(http://www.google.com/search?&q=Fatal%20Python%20error%3A%20%28pygame%20parachute%29%20Segmentation%20Fault)并查看各种帖子报告同样的错误?

例如

http://www.pyweek.org/d/2976/ http://osdir.com/ml/python.pygame/2001-12/msg00055.html ...

【讨论】:

是的,我做到了..我已经阅读了它们,但没有找到任何解决方案..我的问题来自我使用 cx freeze 编译程序时,而不是之前..【参考方案4】:

我遇到了类似的错误,我想我已经找到了解决方案。 我正在使用

pygame.font.SysFont(None,25)

但是,您应该使用系统的字体,而不是传递 None 参数。 我使用的是 Windows 机器,所以我没有用我的系统拥有的任何字体替换。所以我将其替换为:

pygame.font.SysFont("comicsansms",25)

如您所见,我已将 None 替换为 comicsansms,这是 Windows PC 上预装的字体 希望它有效!

【讨论】:

【参考方案5】:

使用 pygame.font.SysFont(FONT_NAME, FONT_SIZE).

【讨论】:

欢迎来到 ***!不鼓励仅使用代码的答案。您能否编辑您的答案以解释它如何修复段错误?

以上是关于Pygame 和 cx_freeze:分段错误的主要内容,如果未能解决你的问题,请参考以下文章

cx_Freeze 将 Python 和 Pygame 文档编译为 .exe 文件时出现奇怪的错误

可执行文件 = 可执行文件 python 错误(尝试使用 cx_freeze 将 pygame 转换为可执行文件)

CX_Freeze 没有响应 Pygame 和 Pykinect

使用 pygame.midi 播放 midi 音符时出现分段错误

无法使用 virtualenv 和 cx_Freeze 将 pygame 转换为可执行文件

使用 pygame 在 cx_Freeze 中包含整个文件夹