Python 3.2:cx_freeze 编译我的程序,但处于调试模式
Posted
技术标签:
【中文标题】Python 3.2:cx_freeze 编译我的程序,但处于调试模式【英文标题】:Python 3.2: cx_freeze compiles my program, but in debug mode 【发布时间】:2013-03-09 23:42:28 【问题描述】:我正在使用 Python 3.2 和 Pygame 制作游戏。我已经成功地使用cx_freeze
将所有内容捆绑到一个可执行文件中,并且它运行了。美好的。唯一的问题是,即使我将-OO
标志传递给我的setup.py
,我的游戏也会在调试模式下编译。(我已经用print
声明__debug__
确认了这一点确实是True
。)
问题是,我的游戏具有在发布模式下自动禁用的调试功能。我不想分发我的游戏的调试功能,也不想手动从代码中删除它们。
我的setup.py
,为简洁起见,如下:
from cx_Freeze import setup, Executable
includes = [<some modules>]
excludes = [<some unwanted modules>]
include_files = [<game assets>]
build_options =
'append_script_to_exe':True,
'bin_excludes':excludes,
'compressed':True,
'excludes': excludes,
'include_files': include_files,
'includes': includes,
'optimize':2,
'packages': ['core', 'game'],
common_exe_options =
'appendScriptToExe' : True,
'appendScriptToLibrary':True,
'compress' : True,
'copyDependentFiles' : True,
'excludes' : excludes,
'includes' : includes,
'script' : '__init__.py',
executable = Executable(**common_exe_options)
setup(name='Invasodado',
version='0.8',
description='wowza!',
options = 'build_exe': build_options,
'bdist_msi': build_options,
executables=[executable])
完整的脚本和我的其他代码一样,可以在https://github.com/CorundumGames/Invasodado/blob/master/setup.py 找到。
在 Ubuntu 12.10 上,我正在使用 python3.2 -OO setup.py build
构建。在 Windows XP 上,我使用 C:\Python32\python -OO setup.py build
构建。
任何帮助都会很棒!
【问题讨论】:
这对于 opengl 代码来说是一个大问题:如果我没记错的话,像 pyglet 和 pyopengl 之类的东西,如果没有优化运行,会在运行时执行大量昂贵的安全检查,从而将代码减慢幅度。 【参考方案1】:有两个稍微不同的事情:将代码编译为字节码的优化,以及解释器运行时的优化。在 cx_Freeze 的选项中设置 optimize
可以优化它生成的字节码,但解释器仍然使用 __debug__ == True
运行。
似乎没有简单的方法可以为嵌入式解释器设置调试标志。它忽略了PYTHONOPTIMIZE
环境变量。作为一种解决方法,您可以使用如下调试标志:
debug = __debug__ and not hasattr(sys, 'frozen')
【讨论】:
你怎么知道没有简单的方法? 我不确定,但我已经尝试了显而易见的事情(使用 -O 运行,设置 PYTHONOPTIMIZE 环境变量),但它们不起作用。而且我在文档或源代码中没有看到任何指向方法的内容。 真遗憾:有时调试断言在 3rd 方代码(例如 pyopengl)中,除非使用 __debug__ == False 运行,否则它们会执行非常昂贵的安全检查。 一个愚蠢的问题:我应该把这个调试标志放在哪里?在 setup.py 中,在命令行“python setup.exe --debug”上,还是在其他地方?提前致谢。 我给出的示例将进入您的应用程序代码,然后您将使用if debug:
对其进行检查(在执行例如额外日志记录之前)。这是一种解决方法,因为我看不到真正禁用 Python 自己的调试模式的方法。不过那是在 2013 年 - 从那时起情况可能会发生变化。以上是关于Python 3.2:cx_freeze 编译我的程序,但处于调试模式的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件