如何在PyInstaller打包的exe文件中启用Python解释器-O选项
问题原因
__debug__是Python解释器启动时就会初始化的内置常量,值由解释器是否开启-O(优化)模式决定,不会读取你程序运行时传入的参数。- 你运行
main.exe -O value1 value2时,-O只是作为普通的sys.argv参数传入你的业务代码,完全不会影响解释器层面的__debug__值。
解决方法
方法1:打包时直接开启优化模式(固定关闭调试逻辑)
如果你不需要运行时切换,打包的时候就确定要去掉所有__debug__为True的分支,直接在打包命令前加-O参数即可,PyInstaller会把优化状态继承到打包后的exe里:
python -O -m PyInstaller --onefile main.py
这种方式打包出来的exe里__debug__固定为False,调试打印逻辑会直接被解释器优化掉,不会执行,也不需要在运行时加任何参数。
方法2:运行时动态控制调试状态(需要保留切换能力)
如果你需要在运行exe的时候手动控制是否开启调试输出,不要依赖内置的__debug__常量,自己解析sys.argv里的-O参数来实现:
修改你的main.py代码如下:
import sys if __name__ == '__main__': # 先判断是否有-O参数 debug_mode = True if '-O' in sys.argv: debug_mode = False # 把-O参数从列表里移除,避免影响后续参数读取 sys.argv.remove('-O') lastIndex = len(sys.argv) - 1 value1 = sys.argv[lastIndex-1] value2 = sys.argv[lastIndex] if debug_mode: print('{} {}'.format(value1, value2))
修改后还是用原来的打包命令打包:
pyinstaller --onefile main.py
运行时传-O就会关闭调试输出,和你预期的效果一致:
main.exe -O value1 value2
内容的提问来源于stack exchange,提问作者DABIN
相关产品推荐
相关产品推荐

