《Nuitka打包实战指南》第七节 启用插件
Posted 一路顺风呀~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Nuitka打包实战指南》第七节 启用插件相关的知识,希望对你有一定的参考价值。
第七节 启用插件
目录
我们在第四节打包以下程序代码时,使用了--enable-plugin=tk-inter命令将tkinter这个标准库打包了进来。
import tkinter
win = tkinter.Tk()
win.iconbitmap('./disk.ico') # 设置窗口图标为当前路径下的disk.ico
win.mainloop()
在打包一些标准库和第三方库时,我们需要添加--enable-plugin命令。该命令会让Nuikta启动相关插件将库所用到的一些依赖一起打包进来。
不添加--enable-plugin命令的话,我们在打包期间,Nuitka会显示一个警告,提示我们需要启用某插件 (这一点非常友好)。打包结束,可执行文件运行时就也会报找不到文件或者文件没有安装好等错误。
那在本节,笔者就带大家详细了解下如何开启相关插件,让大家避雷。
7.1 Nuitka提供了哪些插件
第三方库的数量非常多,所以不是所有库都有插件可用。我们可以用--plugin-list命令来看下Nuitka目前为哪一些库添加了插件支持。
nuitka --plugin-list
可以看到一些比较难打包的库如PyQt,PyTorch,Tensorflow等都有插件来支持。那读者要打包PyQt5的话,就一定要加上--enable-plugin=pyqt5这个命令。
注:并不是所有的标准库和第三方库在打包时都需要插件支持 (也就是说不用--enable-plugin命令就可以打包成功),所以读者不要以为没有找到相关库的插件的话,就无法打包哦。
7.2 第三方库打包示例
这里笔者就用一个PyQt5小程序来演示下,更多详细复杂的打包示例可以去之后的实战篇中阅读。
程序代码如下:
import sys
from PyQt5.QtWidgets import QApplication, QLabel
if __name__ == '__main__':
app = QApplication(sys.argv)
label = QLabel('Hello World')
label.show()
sys.exit(app.exec_())
程序运行截图如下:
打包命令如下:
nuitka --standalone --enable-plugin=pyqt5 hello.py
注:如果没有加--enable-plugin=pyqt5,那么Nuitka就会发出警告,提示你需要使用该命令。没有使用的话打包后的程序也会相应的报错了。
打包完毕后,可以发现hello.dist文件夹中多了一个PyQt5文件夹,里面是PyQt5的一些依赖文件。
程序也是可以正常运行的。
7.3 一定要启用插件吗
一些第三方库比如Numpy、Tensorflow,它们的源码中是还会引入其他第三方库的。如果在打包这类第三方库时添加了--enable-plugin命令,那么打包时间可能会非常非常非常地长 (没有丝毫夸张的意思) 。更悲惨的是,你最后可能还打包失败了。
读者可以尝试打包下面的numpy程序:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
用以下命令开始打包:
nuitka --standalone --enable-plugin=numpy hello.py
读者会发现打包过程异常漫长:
当碰到这种情况时,建议立马Ctrl+C强制终止打包。
我们此时要做的就是用--nofollow-imports命令来禁止打包所有打包的库,加快打包进程。那程序用到的库要怎么添加进来呢?有以下两种方法:
- 打包完毕后手动将相关库复制到hello.dist文件夹下。
- 先将相关库复制到项目路径下,然后使用--include-data-dir命令将它们打包进来。如果你使用的是--onefile命令,那就必须要用这种方法。
所以之前的打包命令可以修改为 (手动复制numpy库):
nuitka --standalone --nofollow-imports hello.py
或者 (先复制numpy到项目路径下,然后用--include-data-dir直接打包进来):
nuitka --standalone --nofollow-imports --include-data-dir=./numpy=./numpy hello.py
具体实战演示可以看《Nuitka打包实战指南》实战打包Numpy_热爱代码-CSDN博客
以上是关于《Nuitka打包实战指南》第七节 启用插件的主要内容,如果未能解决你的问题,请参考以下文章