python打包吐槽
解释型语言打包简直让人折磨
为什么这么说呢?下面列举几个我遇到的坑
工作目录问题¶
就如在这里提到的某个程序的问题,如果在python项目中采用相对路径,就很有可能会出现通过脚本运行没有任何问题,但是使用第三方工具打包编译的时候就会出现一些奇怪的问题,所以如果你做的python项目需要编译,建议单独写一个类或函数去处理工作目录的问题,下面是我自己在用的一段用来处理工作目录的类
class WorkingDir:
@property
def working_dir(self) -> str:
path = ""
if getattr(sys, "frozen", False):
path = os.path.dirname(os.path.realpath(sys.executable))
elif __file__:
path = os.path.dirname(os.path.split(os.path.realpath(__file__))[0])
return path
working_dir = WorkingDir()
print(working_dir.working_dir)
引用PyQt/PySide的问题¶
比如我在这里中提到自定义信号的问题,除了这个问题以外,还有一个坑是,如果你在一个类中声明了一个QThread继承类的对象,而这个对象还是用局部变量去声明的,就有可能会导致运行脚本的时候不出现问题,但是打包之后就会出现一些奇怪的问题,包括但不限于:提示QThread正在运行就被销毁等。所以为了稳妥起见,在声明的时候建议不要用局部变量
nuitka与Qt的线程回调问题¶
这个问题我在这里提到,nuitka对Qt的线程回调兼容性不好,如果不是提前知道的话就容易出现问题
nuitka与cgitb的兼容问题¶
如果你在项目中使用了cgitb模块用来记录崩溃日志,那么很有可能第一次打包的时候会出现无法正常启动,那么很有可能你没有引用import pydoc模块,目前原因不明,所以如果你要是遇到这种情况,只能这么写
pyinstaller与seedir兼容问题¶
曾经我尝试使用seedir模块并进行打包,结果发现pyinstarller打包失败,要么会出现一些莫名其妙的的提示,后来改用cx_freeze打包才没有这个问题,这个问题是2023年4月出现的,不清楚后来的pyinstaller有没有修复这个问题
所以不要以为pyinstaller打包的兼容性非常好,在某些情况下也依然会遇到一些奇奇怪怪的问题
总结¶
当然,并不是说编译型语言就比解释性语言编译打包就好,C/C++项目编译也一样容易让人折磨,比如之前为了运行codeshell.cpp去编译源码,折腾好久才编译成功,又要这个依赖,又要那个编译器等等,甚至有的时候莫名其妙就报错,所以根据自己情况去做选择是最好的