基于flask框架web代码pyinstaller打包

场景概述

最近本人在开发基于flask框架的python web,想把代码保密,且不想太多的文件和依赖,因此研究了利用pyinstaller打包成一个可执行文件。

软件环境

Ubuntu:版本14.04.6
Python:版本3.10.2
OpenSSL:版本1.1.1n
Pycharm:版本Community 2022.1.1

打包准备

1、源码编译好Python,怎么编译参见本人另外一篇文章https://blog.csdn.net/shenweihong/article/details/123541087,Ubuntu版本不同没有影响,本文章测试我把Python源码编译结果放在/work2/PyExeTmp/ 。
2、安装好pyinstaller包,命令:/work2/PyExeTmp/bin/pip3.10 install pyinstaller
3、本python web项目WebDemo,路径:/work2/PyPro/WebDemo

项目文件

python web项目路径:/work2/PyPro/WebDemo,一定要确保这个项目源码能运行成功,不然后面会出现莫名其妙问题,本人用Pycharm运行成功的。
下面看看目录下文件
在这里插入图片描述
描述一下运行需要用到的目录及文件
fonts:字库目录
https_cer:证书目录
image:前端标题图片目录
KeepGenRsaKeys Km_hsm pci_verify:目录包含用到的so库
main.py:启动运行的脚本
pyalgorithm py_common py_developer_tool py_global py_html py_kms py_main py_pci py_picture py_user:项目用到的py文件目录
static:目录包含css js image文件
templates:目录包含html文件

源码编译问题

进入项目,命令:cd /work2/PyPro/WebDemo
我用打包命令:…/…/PyExeTmp/bin/pyinstaller --clean -F -p /work2/PyExeTmp/lib/python3.10/site-packages --add-data templates/:templates/ --add-data static/css/:static/css/ --add-data static/js/:static/js/ --add-data static/image/:static/image/ main.py
结果报错如下:

  • On Debian/Ubuntu, you need to install Python development packages:
    * apt-get install python3-dev
    * apt-get install python-dev
    • If you are building Python by yourself, rebuild with --enable-shared (or, --enable-framework on macOS).
      这个意思是,要么更新系统自带python,如果自己编译的,需要用到动态库模式。
      因为我之前不想系统的,系统升级导致很多麻烦,也不想带太多文件麻烦,就用静态库。
      所以我就重新编译python源码,采用动态库模式,openssl(编译python源码所依赖的模块)无需重新编译动态库。
      进入Python源码目录,命令由
      之前的:./configure --prefix=/work2/PyExeTmp --with-openssl=/work2/OpensslCSDNTmp
      改为:./configure --enable-shared --prefix=/work2/PyExeTmp --with-openssl=/work2/OpensslCSDNTmp
      然后重新编译
      make clean
      make
      make install

加载动态库问题

重新编译好动态库之后,
命令:cd /work2/PyPro/WebDemo
再用打包命令
…/…/PyExeTmp/bin/pyinstaller --clean -F -p /work2/PyExeTmp/lib/python3.10/site-packages --add-data templates/:templates/ --add-data static/css/:static/css/ --add-data static/js/:static/js/ --add-data static/image/:static/image/ main.py
结果报错
/work2/PyExeTmp/bin/python3.10: error while loading shared libraries: libpython3.10.so.1.0: cannot open shared object file: No such file or directory
意思就是找不到动态库libpython3.10.so.1.0,找了下,这个动态库在/work2/PyExeTmp/lib/libpython3.10.so.1.0,因此,应该是要把动态库路径加进来
命令:export LD_LIBRARY_PATH=/work2/PyExeTmp/lib
再执行打包命令,即可生成可执行文件,根据提示生成在这里
/work2/PyPro/WebDemo/dist/main

缺少模块问题

执行打包后的程序
cd /work2/PyPro/WebDemo/dist/
./main
报错:ModuleNotFoundError: No module named ‘alg_hash’
这是还有py文件模块没有加载进来
添加命令:export PYTHONPATH=py_common:py_global:py_html:py_kms:py_main:py_user:py_pci:py_picture:py_algorithm:py_developer_tool
打包命令改为:…/…/PyExeTmp/bin/pyinstaller --clean -F -p /work2/PyExeTmp/lib/python3.10/site-packages --add-data templates/:templates/ --add-data static/css/:static/css/ --add-data static/js/:static/js/ --add-data static/image/:static/image/ --add-data py_algorithm:py_algorithm --add-data py_common:py_common --add-data py_developer_tool:py_developer_tool --add-data py_global:py_global --add-data py_html:py_html --add-data py_kms:py_kms --add-data py_main:py_main --add-data py_pci:py_pci --add-data py_picture:py_picture --add-data py_user:py_user main.py
重新打包完毕之后再执行生成程序./main
报错:ModuleNotFoundError: No module named ‘flask’
这个是python的包,意思就是说把项目所需要的包全部install一次,如需要flask包:
命令…/…/PyExeTmp/bin/pip3.10 install flask
按照这个命令,依次把所有需要的包安装好

加载动态库问题

还是报错:
PyInstallerImportError: Failed to load dynlib/dll ‘./KeepGenRsaKeys/libKeepGenRsaKeys.so’
修改命令把库加进来
…/…/PyExeTmp/bin/pyinstaller --clean -F -p /work2/PyExeTmp/lib/python3.10/site-packages --add-data templates/:templates/ --add-data static/css/:static/css/ --add-data static/js/:static/js/ --add-data static/image/:static/image/ --add-data py_algorithm:py_algorithm --add-data py_common:py_common --add-data py_developer_tool:py_developer_tool --add-data py_global:py_global --add-data py_html:py_html --add-data py_kms:py_kms --add-data py_main:py_main --add-data py_pci:py_pci --add-data py_picture:py_picture --add-data py_user:py_user --add-data KeepGenRsaKeys:KeepGenRsaKeys --add-data pci_verify:pci_verify main.py

注意添加:–add-data KeepGenRsaKeys:KeepGenRsaKeys --add-data pci_verify:pci_verify

测试验证

重新生成,运行
cd /work2/PyPro/WebDemo/dist/
./main
验证一下能够正常运行了
换一台电脑,没有相关python配置和源码的,将可执行文件main复制过去,仍然可以正常运行,测试成功。

指令简介

最终成功运行的打包指令为:
…/…/PyExeTmp/bin/pyinstaller --clean -F -p /work2/PyExeTmp/lib/python3.10/site-packages --add-data templates/:templates/ --add-data static/css/:static/css/ --add-data static/js/:static/js/ --add-data static/image/:static/image/ --add-data py_algorithm:py_algorithm --add-data py_common:py_common --add-data py_developer_tool:py_developer_tool --add-data py_global:py_global --add-data py_html:py_html --add-data py_kms:py_kms --add-data py_main:py_main --add-data py_pci:py_pci --add-data py_picture:py_picture --add-data py_user:py_user --add-data KeepGenRsaKeys:KeepGenRsaKeys --add-data pci_verify:pci_verify --add-data image:image --add-data https_cer:https_cer --add-data fonts:fonts main.py

可以用这个命令查看参数介绍:…/…/PyExeTmp/bin/pyinstaller -h
–clean:清理上一次打包的临时文件和缓存
-F:生成结果是一个文件
-p:import python库相关的包和文件
–add-data:添加资源和文件,格式为,源文件:目的文件
main.py:入口script

资源路径修改

本项目用到一些资源文件,如:
fonts:字库目录
https_cer:证书目录
image:前端标题图片目录
因为在打包的里面,代码中使用要注意路径

使用证书:
原来代码:
app.run(host=‘0.0.0.0’, debug=True, port=8011, ssl_context=(‘https_cer/server.crt’, ‘https_cer/server.key’))
需要改成:
app.run(host=‘0.0.0.0’, debug=CONFIG_USE_DEBUG, port=8011,
ssl_context=(os.path.join(app.root_path, ‘https_cer’, ‘server.crt’),
os.path.join(app.root_path, ‘https_cer’, ‘server.key’)))

使用字库:
原来代码:
fonts_dir= ‘fonts’
需要改成:
fonts_dir=os.path.join(global_param.g_sys_root_dir, ‘fonts’)
global_param.g_sys_root_dir是在main.py中赋值global_param.g_sys_root_dir=app.root_path
因为字库是在其他路径下的py文件中使用,而打包后开始路径为main.py同级路径下

Windows平台命令

windows平台和linux平台打包命令还是有所差异的,明显的例子就是–add-data fonts:fonts,中间的冒号在windows下打包不识别,同一个项目,下面是本人在windows平台打包后能成功运行的

venv\Scripts\pyinstaller.exe --clean -F --add-data venv/Lib/site-packages;. --add-data templates;templates --add-data static/css/;static/css/ --add-data static/js/;static/js/ --add-data static/image/;static/image/ --add-data py_algorithm;. --add-data py_common;. --add-data py_developer_tool;. --add-data py_global;. --add-data py_html;. --add-data py_kms;. --add-data py_main;. --add-data py_pci;. --add-data py_picture;. --add-data py_user;. --add-data py_yuetai_furniture;. --add-data KeepGenRsaKeys;KeepGenRsaKeys --add-data pci_verify;pci_verify --add-data image;image --add-data https_cer;https_cer --add-data fonts;fonts main.py

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值