当前位置: 首页 > news >正文

pyinstaller 打包发布flask 应用

pyinstaller 打包发布flask 应用

安装

pip install pyinstaller

入口程序,启动程序:app.py

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

1 打包成一个二进制文件,没有静态文件和模板

pyinstaller --onefile app.py

PyInstaller 会在 dist 目录下生成一个 app 文件,直接运行

2 打包成一个软件包dist,有静态文件和模板

flaskr 文件夹下的结构:
- instance 实例数据库
- static 静态文件
- templates 模版
- uploads 上传的文件夹

flaskr/
├── a.py
├── b.py
├── c.py
├── __init__.py
├── instance
│   └── a.sqlite
├── tt
│   ├── xxx.py
├── schema.sql
├── static
│   ├── 1.css
│   ├── 2.css
│   ├── 3.css
│   ├── editormd
│   ├── images
│   │   ├── 1.jpg
│   │   ├── 2.png
│   │   ├── 3.jpg
│   │   ├── 4.jpg
│   │   └── 5.jpg
│   ├── index.css
│   └── style.css
├── templates
│   ├── a
│   │   ├── 1.html
│   │   └── 2.html
│   ├── b.html
│   └── c
│       ├── 1.html
│       ├── 2.html
│       ├── 3.html
│       ├── 4.html
│       ├── 5.html
│       └── 6.html
├── upload.py
└── uploads├── txt2img-20240828-175415-0.png├── txt2img-20240828-211041-0.png├── txt2img-20240828-213517-0.png

目录

/proj/flaskr/
/proj/run.py

入口文件 run.py

from flaskr import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)
打包:

1 配置路径:create_app 入口函数配置路径:
修改 flaskr/init.py :

import os
import sys
from flask import Flask# 指定 basedir 
if getattr(sys, 'frozen', False):  # 检查是否在打包后的环境中运行exedir = os.path.dirname(sys.executable)basedir = os.path.join(exedir,'_internal','flaskr')
else:basedir = os.path.abspath(os.path.dirname(__file__))def create_app(test_config=None):"""Create and configure an instance of the Flask application."""app = Flask(__name__, instance_relative_config=True)app.config.from_mapping(# a default secret that should be overridden by instance configSECRET_KEY="dev",DATABASE=os.path.join(basedir,'instance', "flaskr.sqlite"),UPLOAD_FOLDER=os.path.join(basedir, 'uploads'), TEMPLATE_FOLDER=os.path.join(basedir, 'templates'),STATIC_FOLDER=os.path.join(basedir, 'static'),)# 省略其它代码return app

2 生成 run.spec

pyinstaller  --specpath=. run.py

3 修改run.spec 添加以下内容,把静态文件和模板文件打包进去

     datas=[('flaskr/static', 'flaskr/static'),('flaskr/templates', 'flaskr/templates'),('flaskr/instance', 'flaskr/instance'),('flaskr/uploads', 'flaskr/uploads'),],

修改后完整的run.spec :

# -*- mode: python ; coding: utf-8 -*-a = Analysis(['run.py'],pathex=[],binaries=[],datas=[('flaskr/static', 'flaskr/static'),('flaskr/templates', 'flaskr/templates'),('flaskr/instance', 'flaskr/instance'),('flaskr/uploads', 'flaskr/uploads'),],hiddenimports=[],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,optimize=0,
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='run',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
coll = COLLECT(exe,a.binaries,a.datas,strip=False,upx=True,upx_exclude=[],name='run',
)

4 生成软件包 dist

  pyinstaller run.spec  

5 生成的dist目录结构

dist/run/run
dist/run/_internal/flaskr/├── instance│   └── a.sqlite├── static│   ├── 1.css│   ├── 2.css│   ├── 3.css│   ├── editormd│   ├── images│   │   ├── 1.jpg│   │   ├── 2.png│   │   ├── 3.jpg│   │   ├── 4.jpg│   │   └── 5.jpg│   ├── index.css│   └── style.css├── templates│   ├── a│   │   ├── 1.html│   │   └── 2.html│   ├── b.html│   └── c│       ├── 1.html│       ├── 2.html│       ├── 3.html│       ├── 4.html│       ├── 5.html│       └── 6.html├── upload.py└── uploads├── txt2img-20240828-175415-0.png├── txt2img-20240828-211041-0.png├── txt2img-20240828-213517-0.png

直接运行

dist/run/run

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++奇迹之旅:深度解析list的模拟实现
  • 【时时三省】(C语言基础)指针进阶6qsort函数的使用
  • BCC软译码和硬译码之间的性能差别
  • CAN协议通信 学习笔记
  • Linux启动流程和内核管理
  • 使用python导出Excel表格中的lua配置
  • 【网络安全 | 虚拟机】VMware Workstation Pro下载安装使用教程(免费版)
  • C语言深度复习【数组和指针】
  • 滚雪球学MyBatis-Plus(02):环境准备
  • python-word添加标题,段落,文字块
  • C++ 计算日期到天数转换(牛客网)
  • 基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统
  • Java throw和throws有什么区别?
  • 将工程内的组件 集成并发布到私有仓库以及后续联动运行(热启动)
  • Hibernate 批量插入速度慢的原因和解决方法
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 2017-09-12 前端日报
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • co.js - 让异步代码同步化
  • Cookie 在前端中的实践
  • ES6 学习笔记(一)let,const和解构赋值
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java2019面试题北京
  • jquery cookie
  • Js基础知识(一) - 变量
  • nginx 负载服务器优化
  • node和express搭建代理服务器(源码)
  • SQLServer之创建数据库快照
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从0到1:PostCSS 插件开发最佳实践
  • 前端面试之CSS3新特性
  • 设计模式走一遍---观察者模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 写给高年级小学生看的《Bash 指南》
  • 怎么把视频里的音乐提取出来
  • 正则与JS中的正则
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • # 计算机视觉入门
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.ajax()方法详解
  • (11)MATLAB PCA+SVM 人脸识别
  • (4.10~4.16)
  • (Note)C++中的继承方式
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (接口封装)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (小白学Java)Java简介和基本配置
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)scrum常见工具列表
  • .NET 中让 Task 支持带超时的异步等待
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】