当前位置:网站首页 > 技术博客 > 正文

python如何打包交付



PyInstaller 可以将 Python 项目打包成一个可执行文件,或是一个文件夹,包含可执行文件以及依赖包。方便我们将 Python 项目交付给用户,方便用户使用的同时也可以一定程度的保护项目源代码。本文将介绍如何简单使用 PyInstaller 打包。

使用 安装即可:

 

让我们新建一个项目命名为 ,文件结构如下:

 

其中项目核心文件为 ,内容如下:

 

现在,进入到项目根目录 ,运行如下命令:

 

初次运行可能会出现下面的错误:

 

这是因为 PyInstaller 需要 python-dev 环境,如果是使用 可以用以下命令重新安装 Python:

 

或者,可以安装 python-devel 版本,比如在 CentOS 上可以通过下面的命令查看可用版本:

 

安装 即可。

成功运行后目录下会多出来一些文件,现在的结构如下:

 

其中 就是打包出来的可执行文件了,我们现在可以将 整个文件夹压缩并打包交付给用户。用户拿到后解压并运行 文件即可。以下是运行后的结果

 

也可以通过指定 参数将依赖包与项目文件打成一个文件:

 

此时可执行文件路径为:

 

相对与单个文件的形式,单个文件夹在启动时会更快,而且在后期更新时,在没有依赖更新的情况下,仅需要交给客户项目文件即可,可以一定程度减少文件传输。

一般来说,我们的项目很少会只有一个文件。现在,让我们为 创建一个新的文件 ,作为核心逻辑的存放位置。现在的目录结构如下:

 

文件内容为:

 

通常情况下,如果我们在 中有导入 的话,PyInstaller 会在打包时将 也一同编译进去,但若是涉及到动态导入的话,则 文件会缺失导致导入失败,比如现在将 逻辑更新如下:

 

再次打包并运行,会报错找不到模块 :

 

可以通过指定 参数告诉 PyInstaller 模块需要被一块打包,通过这样的方式再次打包后就可以正常运行了:

 

如果只有一个 是动态导入,通过传入 即可,如果项目中存在多个模块或依赖库存在动态导入,那么命令行的参数只会越来越长变得难以阅读,为此 PyInstaller 提供了 模式可以便于我们通过 Python 文件维护这些动态导入的模块。

下面效仿 为项目添加一个 模块,分别提供了对 MySQL 和 Oracle 数据库的支持,现在项目结构如下:

 

中增加对支持的数据库的加载并打印到屏幕:

 

现在在项目中新增一个文件夹用于管理 ,命名为 ,项目结构如下:

 

在 下新建一个名为 的文件,内容如下:

 

然后使用命令重新打包,指定 为 文件夹路径,同时将 改为 :

 

再次运行,可以看到不管是 还是 模块都有被正常加载:

 

如果我们想要提供的包只支持 ,那么可以在 中对 模块做更精细的控制。首先修改 为:

 

如果想对 下面的子模块提供更进一步的控制,可以在 下面新建一个 文件,并写上具体逻辑,PyInstaller 会在打包时自动找到该文件并应用,同理其他模块也是如此。

再次打包并运行,结果如下:

 

项目增加了一些模板文件需要提供给用户,放在 目录下:

 

那么如何将 下面的文件能被一起打包并被程序识别到呢,可以通过 参数将文件放入指定的相对路径,现在将打包命令更改为:

 

其中 前的 是我们打包时 所在的相对路径, 后的 是期望打包后文件所在的路径。后者的 代表了打包后项目运行时的根目录。

将 文件修改为如下以获取可用的模板文件:

 

重新打包并运行,可以看到模板文件已经被正常加载:

 

如何判断当前代码是在打包后的环境运行,还是非打包环境运行呢,可以通过如下方式:

 

PyInstaller 会在运行时将打包文件放在 所指向的路径下,对于以文件夹方式打包的项目,该路径实际上就是 ,而对于单个文件的方式,这个路径实际上指向的是某个临时文件夹路径(比如 Linux 下的 ),如果项目需要生成一些需要保留的文件,可以通过参数 重新指定该路径。

更多用法可参考官方文档:PyInstaller Manual — PyInstaller 6.3.0 documentation

  • 上一篇: orm框架实现原理
  • 下一篇: vmstat 命令
  • 版权声明


    相关文章:

  • orm框架实现原理2024-11-14 12:01:00
  • 思科模拟器交换机远程登录2024-11-14 12:01:00
  • 积分微分电路功能2024-11-14 12:01:00
  • c++ fstream read2024-11-14 12:01:00
  • c+ 代码大全2024-11-14 12:01:00
  • vmstat 命令2024-11-14 12:01:00
  • cglib和jdk动态代理底层实现原理2024-11-14 12:01:00
  • c++常用容器类名2024-11-14 12:01:00
  • 开窗函数partition by2024-11-14 12:01:00
  • javatreemap优点2024-11-14 12:01:00