《Nuitka打包实战指南》第六节 打包资源文件

Posted 一路顺风呀~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Nuitka打包实战指南》第六节 打包资源文件相关的知识,希望对你有一定的参考价值。

第六节 打包资源文件

目录

6.1 资源打包命令详解

6.2 资源打包实战练习


如果程序代码用到了一些资源文件 (如图片、音视频、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配置文件中的其他参数

《Buildozer打包实战指南》第六节 buildozer.spec配置文件中的其他参数

《Nuitka打包实战指南》实战打包PyGame

《Nuitka打包实战指南》实战打包PyGame

《Nuitka打包实战指南》第一节 下载和环境配置