场景概述

最近本人在开发基于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

基于flask框架web代码pyinstaller打包相关推荐

  1. 展示一下基于flask框架的网页播放器的代码

    <p>下面是基于Flask框架的网页播放器的代码:from flask import Flaskapp = Flask(<strong>name</strong>) ...

  2. PythonWeb 基于Flask框架+MySQL+html实现雨课堂系统

    一.开发环境的安装与配置 1.1 Python3.10以及PyCharm的安装 浏览器输入Python官方网址:https://www.python.org/,点击下载进入下载界面,选择相对应的版本, ...

  3. python上手--flask框架web开发实践-数据库

    这篇文章,由易而难,步骤清晰,思路讲得很明白.花两小时跟着作者稻谷先生的这篇文章走一遍,对学习python使用Flask来开发web的应用很有帮助. python上手--flask框架web开发实践 ...

  4. Flask学习 黑马程序员-6节课入门Flask框架web开发视频(中途撤退,寻找py3教程)

    文章目录 postman工具 get和post 如何给路由传参 解析 @app.route('')这个叫视图函数 Jinja2模板引擎 动态传参 注释.变量代码块以及控制代码块的使用 注释:ctrl+ ...

  5. 前端—基于Flask框架调用百度接口实现语音识别功能(使用蓝图blueprint)

    配合"基于Flask框架调用百度接口实现语音识别功能"使用的前端参考代码 后端代码链接 Python-基于Flask框架调用百度接口实现语音识别功能:基于Flask框架调用百度接口 ...

  6. 一个基于Flask框架做的仿QQ邮箱系统(收发邮件、贝叶斯模型训练、垃圾邮件过滤、个性化标签)

    一个基于Flask框架做的仿QQ邮箱系统(收发## 标题邮件.贝叶斯模型训练.垃圾邮件过滤.个性化标签) 1.贝叶斯邮件垃圾邮件分类 对上千封邮件进行贝叶斯模型分类训练,对基本邮件实现垃圾分类效果. ...

  7. 【Python】基于 Flask 框架,模拟微信朋友圈的服务端

    [Python]基于 Flask 框架,模拟微信朋友圈的服务端 一.目的:模拟微信朋友圈的服务端,需要满足以下场景: 1.发表内容时带上图片信息,内容包括(具体内容和id,id指定全局唯一标识),客户 ...

  8. 基于Flask框架的任务管理系统

    基于Flask框架的任务管理系统 基本功能: 任务的添加.删除.查看.编辑.点击完成 用户登录.登出 ##数据库层 任务: 任务id号 任务名 任务添加时间 任务的状态(完成/未完成) 任务所属部门( ...

  9. 开发了一款基于 Flask 框架的在线电影网站系统(附 Python 源码)

    文章目录 前言 项目介绍 源码获取 运行环境 安装依赖库 项目截图 首页展示图 视频展示页 视频播放页 后台管理页 整体架构设计图 项目目录结构图 前台功能模块图 后台功能模块图 本地运行图 前言 今 ...

最新文章

  1. nodejs安装和卸载
  2. 给asterisk1.8.7添加menuselct选项
  3. python3安装后无法使用退格键的问题
  4. springboot 整合hbase
  5. python生成数字_Python生成数字图片代码分享
  6. java Excel导出 xlsx格式(超简单)
  7. Java同步数据结构之ConcurrentLinkedQueue
  8. 用好SVG格式 让网站速度提升起来
  9. VB.NET数据库中插入数据
  10. 【转】强大的在线书库
  11. Java学习笔记(五):Java多线程(细致入微,持续更新)
  12. JAVA实现Excel照相机功能_excel照相机功能 Excel中鲜为人知的“照相机”功能及使用方法...
  13. TypeError: __init__() got an unexpected keyword argument ‘rate‘
  14. 号称最为简明实用的Django上手教程(下)
  15. 九阴真经Ambari——4.创建本地仓库
  16. 【完结】囚生CYの备忘录(20221121-20230123)
  17. linux下tshark安装及应用
  18. 获取图片Exif信息
  19. 【JavaScript】 模块 module
  20. 2007年9月1日御夫座流星雨

热门文章

  1. 关于58同城和赶集网被曝光后的反思
  2. Windows下,Pytorch使用Imagenet-1K训练ResNet的经验(有代码)
  3. html上下左右键事件,js键盘上下左右(方向键)事件
  4. 比kindle快N倍,电子墨水做的电脑显示器!这个速度我是服气的
  5. 计算机辅助设计课程设计评分标准,计算机辅助设计课程设计报告 - 图文
  6. vue-判断设备是手机端还是pc端
  7. 代理刷网页点击量-点到为止 2014-03-11 09:40
  8. 数据结构:根据中序序列和先序序列建二叉树算法
  9. WICC 2021成功召开 融云带来 PaaS 服务演进方向新探索
  10. QQ截图无法截取右键菜单等内容解决方案