linux 打包文件夹_使用wxPython打造印象笔记(19)打包发布应用

50589423d8418b8b439a3aab7f087533.png

在开发了一些功能之后,如果我们需要生成可执行文件,可以使用打包工具。常用的python 打包工具有 py2exe,py2app,PyInstaller,cx_Freeze,Nuitka等,其中 PyInstaller 使用简便而且功能强大,接下来我们使用它来打包笔记项目。

我是在Mac电脑上打包的,Windows 和 Linux 系统没有测试,肯定会有所差异,尤其是cefpython的配置要特别注意。

生成打包规格文件

首先安装 PyInstaller:

pip install PyInstaller

安装好了之后,进入到项目目录下,生成规格文件,--onefile 表示单文件模式,--windowed 表示生成GUI应用,main.py 为程序入口文件。

pyi-makespec --onefile --windowed main.py

运行之后,就会创建 main.spec 文件,这个文件规定了打包流程和配置信息,我们接下来会编辑它,配置一些打包参数,例如应用图标、名字等,最后再执行打包命令。

单文件和单目录

PyInstaller 支持两种打包方式:单文件和单目录,上面的参数 --onefile 表示打包成单文件,--onedir 表示打包成单目录,也是默认的打包方式。

单文件是将项目打包成一个可执行程序,在 Windows 系统上扩展名为 exe,Mac系统上扩展名为 app,Linux系统上无扩展名。

单目录则是将项目打包到一个文件夹里面,文件夹里面中也会包含一个可执行程序。

PyInstaller 在打包时会收集项目依赖(模块和一些常用包),打包成单文件时,这些依赖就会压缩到单个文件中,当运行这个文件时,它会将项目依赖解压到一个临时文件夹中,然后开始运行程序。而打包成单目录时,文件夹中会包含所有的项目依赖,程序启动时不需要将依赖解压到临时文件夹。

因为单文件模式会压缩项目依赖,所以比单目录模式的程序要小一些。但由于需要将依赖项解压到临时文件夹中,所以程序启动比单目录模式慢一点。另外,单文件模式下,一些系统变量如 __file__ 不会更新,所以更容易出错。

规格文件

打开生成的 main.spec 文件,内容如下:

# -*- mode: python ; coding: utf-8 -*-

block_cipher 用于源码加密,我们跳过。

Analysis 是分析、收集项目中涉及到的模块、数据和动态链接库,接下来的 PYZ 是将模块编译为pyc文件并生成一个zip包,EXE 是把zip包和其他文件打包成可执行程序。

如果是单目录模式,还会多一个 COLLECT 步骤,将 Analysis 和 PYZ 这两步得到的所有依赖文件拷贝到一个文件夹里面。

添加数据文件

这里的数据文件也就是静态资源文件,例如图片、文本、HTML等,Analysis 步骤不会自动收集数据文件,我们需要手动配置。

assets / text_editor 文件夹中包含HTML、CSS和JS文件,修改 Analysis 对象的 datas 参数:

# ..

datas 参数接收一个元祖列表,元祖的第一个元素表示数据文件的路径,第二个元素表示打包之后的路径(如果是单文件模式,则表示在解压后文件夹中的路径)。

hooks

除了在当前项目中会涉及到数据文件,有些包中也会有数据文件,我们可以按照上面的方法修改 Analysis 的 data 参数来实现,也可以使用 PyInstaller 提供的 hooks。

有两种 hooks,一种用于在打包过程中修改构建参数,另一种用于在打包后的程序启动时加载模块。我们在这里只讨论前者。

hook-jieba.py

笔记搜索使用了 jieba,这个包中含有重要的 dict.txt 和 analyse 目录下的 idf.txt 文件,如果缺少了它们,笔记搜索功能将无法正常使用。

如何通过 hook 来添加这两个数据文件呢?

首先在项目目录下创建 hooks 文件夹,然后新建 hook-jieba.py 文件,注意文件名必须是 hook-模块名.py 的格式,然后输入以下内容:

import 

collect_data_files 方法用于提取包中的数据文件,sub_dir 参数用来指定特定文件夹。

然后修改 Analysis 的 hookspath 参数:

# ...

注意我们这里修改了 Analysis 里面的 datas 参数,hook 文件中还支持修改 hiddenimports,excludedimports 以及 binaries 这三个参数。

spec文件内容实际上就是Python代码,所以也可以在 spec 文件中进行类似的操作,不过使用 hook 文件便于管理。

hook-cefpython3.py

我们的项目使用了 cefpython3 包,里面同样包含了一些数据文件,并且包文件内容在不同系统下也会有所差异。

在 hooks 文件夹下新建 hook-cefpython3.py:

import 

我们添加了数据文件和二进制程序并排除了一些无用的库文件。

6be6be9dbad5dd30b765e62df30bed82.png

如上图所示,如果项目的Python版本为3.7,那么只需要保留 cefpython_py37.so 即可,其他的 .so 文件不需要打包进来。

sys._MEIPASS

前面提到过,单文件模式打包的程序在启动时,会将所有依赖解压到一个临时文件夹中,这个文件夹的路径是什么?如何在运行时确定是普通运行还是在打包后的程序中运行?

使用 PyInstaller 打包之后的程序,在它运行时,sys.frozen 为 True,sys._MEIPASS 为当前程序所在的文件夹路径,单文件模式表示临时文件夹的路径。

为了 让 cefpython3 在打包后的程序中正常使用,还需要设置好初始化参数。修改 views / webview.py:

def 

打包成Mac应用

在 Windows 系统上,EXE 步骤会生成 exe 文件;但是在 MacOS 上,EXE 步骤却不会生成 app 文件,BUNDLE 才会创建 app 文件。

我们给应用添加一个图标,放在 assets / icon.icns 里面,然后修改 BUNDLE:

app 

规格文件修改好了之后,在当前项目目录下运行:

pyinstaller main.spec

命令结束之后,dist 文件夹下就会出现 ultra note.app 文件,表示打包成功了。

总结

如果项目不需要涉及到hook或者数据问题,可以在运行 pyinstaller 命令时添加打包参数,就可以直接打包了,否则的话,可以参考本文,首先创建规格文件然后修改最后再打包。

Windows 和 linux 系统上的打包情况可能会有所不同,需要结合 cefpython3 的文档进行适当调整。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值