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 可执行文件

尝试使用 cx_Freeze 编译时 Python 崩溃

如何减少 cx_Freeze 编译的 Python 可执行文件大小?

无法使用 cx_Freeze 编译

cx_freeze 如何编译 Python 脚本?

无法使用 cx_freeze 和 PySide2 进行编译