Nuitka打包就是先略过torch,numpy,pyqt等系统库,运行时缺什么包就从对应python环境中复制相应的包过去就好了。
在我打包完pytorch代码并复制torch和numpy包到根目录后,还是出现了导入失败的问题。经过百度发现是由于numpy版本太高的原因。在我把numpy从1.19.*降到1.16.*之后,重复上述操作就打包成功了。
Nuitka?是一种新型的打包技术,它可以把python代码用c重新编译并运行
nuitka --standalone --mingw64 --show-memory --show-progress --nofollow-imports --output-dir=o index.py
?
发布一个程序
如果python程序中仅仅使用了一些自定义的模块,那么参数--follow-imports 就足以达到发布的效果,一个exe外加一个python3x.dll就可以在任何电脑上运行,无论是否安装python(当然架构要对应),然而实际情况往往比较复杂,稍微强大一点的程序都会调用一些第三方库,比如pyqt,numpy,这些模块中调用了大量的pyd或者dll文件。这个时候就需要使用参数--standalone 。
参数--standalone 默认包含参数--follow-imports ,即会尝试对所有的引用到的库都进行打包,将这些库中的py或者pyc打包进exe,然后再将所依赖的二进制文件(dll或者pyd)拷贝到exe所在文件夹。只要命令能够执行完成不出错,生成的exe就可以完全脱离python环境独立运行。
如果某些库没有被打包进exe,程序仍会试图通过python3x.dll去搜索路径中查找这些库,然后进行调用,调用方式跟py文件一模一样。
nuitka打包相对来说是比较耗费时间的,特别是针对像pandas这样的大家伙,所以在最终发布之前,可以暂时不对这些库进行打包(--nofollow-imports),而是将这些库手动拷贝到搜索路径中,比如exe同级目录。只要能够找到这些库,程序就能正常运行,否则会提示no module named xxx
|