FreeBSD10.4下PyInstaller编译调试符号及ImportError问题求助
__debug__输出及ImportError问题 一、让PyInstaller编译时将__debug__设为False的方法
__debug__是Python的内置常量,只有当Python解释器以**优化模式(-O参数)**运行时才会被设为False。PyInstaller默认不会启用这个优化,所以你需要明确告诉它使用优化模式:
方法1:直接给
pyinstaller命令添加--optimize=2参数(或简写为-O2),这会让PyInstaller在打包时调用Python解释器的优化模式,此时__debug__会变为False,对应的调试代码会被自动剔除:pyinstaller --optimize=2 my_script.py注:
-O(即--optimize=1)会移除断言和调试代码,-O2会进一步移除文档字符串,两者都能让__debug__变为False,根据需求选择即可。方法2:如果脚本里有大量依赖
__debug__的逻辑,也可以在脚本开头手动添加判断,但更推荐用PyInstaller的优化参数,这是更标准的打包优化方式。
二、直接运行__main__.py出现ImportError的原因及修正
你直接执行/usr/local/bin/python3.6 /usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py的操作有误,核心原因是:PyInstaller的__main__.py里使用了相对导入(from . import __version__),当你把它当作独立脚本运行时,Python会将其视为单独的脚本文件,而非PyInstaller包的一部分,导致相对导入路径失效,从而抛出ImportError。
正确的调用方式应该是用Python的-m参数以模块方式运行PyInstaller,这样能保证包内的相对导入正常工作:
/usr/local/bin/python3.6 -m PyInstaller my_script.py
如果需要同时启用优化,直接加上-O2参数即可:
/usr/local/bin/python3.6 -O2 -m PyInstaller my_script.py
另外,也可以检查当前工作目录下是否存在名为PyInstaller的文件或文件夹,这会干扰Python的模块导入路径,引发类似错误。如果有的话,重命名或删除即可。
内容的提问来源于stack exchange,提问作者SCilek

