《Nuitka打包实战指南》第六节 打包资源文件
Posted 一路顺风呀~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Nuitka打包实战指南》第六节 打包资源文件相关的知识,希望对你有一定的参考价值。
第六节 打包资源文件
目录
如果程序代码用到了一些资源文件 (如图片、音视频、json文件),我们就需要将这些资源文件一同打包,否则程序运行会报找不到某某某文件的错误。
读者当然可以选择在打包完毕之后手动复制资源文件,但是这只能对--standalone多文件模式打包有效。如果你用--onefile命令将程序打包成单个可执行文件,那么手动复制是不可行的。我们从第五节了解到,程序只有在双击运行后,才会解压出临时文件夹,所以我们是无法在程序运行前将资源复制到临时文件夹的,那么程序也会因无法定位到资源文件而报错了。
不管是用--standalone还是--onefile打包,我们最好直接使用命令将资源文件打包进来。
6.1 资源打包命令详解
① --include-data-file
我们可以使用该命令添加一个或多个资源文件,使用格式如下:
--include-data-file=资源文件源路径=资源文件目标路径
第一个等号后面跟的是资源文件当前所在位置 (可以是绝对路径,也可以是相对路径),而第二个等号后面跟着的是资源文件在hello.dist文件夹中的位置 (路径必须是相对于hello.exe的)。
在打包前,hello.py是入口文件,打包后,hello.exe是程序入口。也就是说打包后各个资源文件相对于hello.exe的路径要跟打包前相对于hello.py文件的路径一样!否则程序会找不到资源文件。
注:指的是相对于hello.dist文件夹中的hello.exe,而不是--onefile生成的hello.exe。
我们现在来尝试打包下在第四节中的程序:
import tkinter
win = tkinter.Tk()
win.iconbitmap('./disk.ico') # 设置窗口图标为当前路径下的disk.ico
win.mainloop()
disk.ico图标文件下载地址:
- 链接:https://pan.baidu.com/s/16BVXyWhdL8XUxYJly-PcZw
- 提取码:qmfr
使用以下命令开始打包:
nuitka --standalone --enable-plugin=tk-inter --include-data-file=./disk.ico=./ hello.py
第一个等号后面的./disk.ico表示我要打包当前路径下的disk.ico图标文件,第二个等号后面的./表示我要将disk.ico图标文件打包到hello.dist下,和hello.exe路径同级。
打包完毕后,可以发现disk.ico文件直接出现在了hello.dist文件夹下:
也就是说我们现在可以直接运行hello.exe而不需要再手动把disk.ico文件拷贝过来。
注:读者现在可以用--onefile命令进行打包,运行exe后会发现disk.ico出现在解压出来的临时文件夹下。
如果我们要打包多个资源文件的话,可以使用通配符*来搞定,下面是几个示例:
1. 将folder_name文件夹下的所有文件都放到hello.dist文件夹下的folder_name文件夹中。
--include-data-file=./folder_name/*=./folder_name/
2. 将folder_name文件夹下所有的txt文件都放到hello.dist文件夹下的folder_name文件夹中。
--include-data-file=./folder_name/*.txt=./folder_name/
3. 将folder_name文件夹下所有的txt和mp3文件都放到hello.dist文件夹下的folder_name文件夹中。
--include-data-file=./folder_name/*.txt=./folder_name/ --include-data-file=./folder_name/*.mp3=./folder_name/
② --include-data-dir
该命令可以让我们直接将一整个资源文件夹复制到目标位置 (文件夹下的子目录也会被复制过去,子目录的子目录也一样)。使用格式如下:
--include-data-dir=资源文件夹源路径=资源文件夹目标路径
比方说下面这个示例就是将当前路径下的images文件夹直接复制到hello.dist文件夹下了:
--include-data-dir=./images=./images
我们在demo文件夹下新建一个images文件夹,然后复制几个disk.ico文件到其中。
此时hello.py的内容不重要,就将其改为print('Hello World'),笔者这里只是想演示如何打包images文件夹,使用以下命令打包:
nuitka --standalone --include-data-dir=./images=./images hello.py
打包完毕后,发现hello.dist文件夹下多了一个images文件夹,其中也有全部的disk.ico图标文件。
注:如果资源文件只有一两个,而且没有放到文件夹中,那么就使用--include-data-file命令;如果资源文件被放在了文件夹下,则使用--include-data-dir命令;如果大部分资源被放在了文件夹下,一小部分没有,那么可以结合以上两个命令进行打包。
6.2 资源打包实战练习
资源打包是非常重要的一个知识点,读者朋友们一定要好好理解并掌握。下面是笔者为大家准备的几个打包小练习,所使用的命令我会统一放在最后。
1. 打包disk.ico图标文件
hello.py内容:
import tkinter
win = tkinter.Tk()
win.iconbitmap('./icon/disk.ico') # 设置窗口图标为icon文件夹下的disk.ico
win.mainloop()
demo文件夹目录结构:
提示:disk.ico当前还不在icon文件夹下,所以运行hello.py会报错哒~
2. 打包两个txt文件
hello.py内容:
with open('./a.txt', 'r') as f1:
print(f1.read())
with open('./b.txt', 'r') as f2:
print(f2.read())
注:a.txt和b.txt中的内容可以随便写。
demo文件夹目录结构:
3. 打包一个文件夹
hello.py内容:
with open('./dir/file/a.txt', 'r') as f:
print(f.read())
demo文件夹目录结构:
答案:
nuitka --standalone --include-data-file=./disk.ico=./icon/ hello.py
nuitka --standalone --include-data-file=./*.txt=./ hello.py
nuitka --standalone --include-data-dir=./dir=./dir hello.py
以上是关于《Nuitka打包实战指南》第六节 打包资源文件的主要内容,如果未能解决你的问题,请参考以下文章
《Buildozer打包实战指南》第六节 buildozer.spec配置文件中的其他参数
《Buildozer打包实战指南》第六节 buildozer.spec配置文件中的其他参数