【API部署】fastapi与nuitka打包py项目

news2025/4/17 17:01:04

提示:分两部分:fastapi接口调用,与nuitka快速打包

功能:作为一名算法工程师,训练机器学习模型只是为客户提供解决方案的一部分。 除了生成和清理数据、选择和调整算法之外,还需交付和部署结果,以便在生产中使用

实现python或基于虚拟环境的pytorch项目,在终端部署。即py文件最终变成exe,可脱离python环境,在任意终端运行。

文章目录

  • 如何测试
    • 1.利用python中的request
    • 2.利用软件postman
  • 一、fastapi(创建API服务)
    • 1.安装
    • 2.小示例
    • 3.完整代码
    • 4.拓展 (返回其他类型、数据库实战)
  • 二、nuitka打包与部署
    • 1.环境与安装
    • 2.下载Nuitka
    • 3.使用nuitka简单打包python代码
    • 4.使用nuitka打包pyqt5项目
  • 三、Docker部署


如何测试

前端如何向后端发送请求

1.利用python中的request

Requests建立在世界上下载量最大的Python库urllib3上,它令Web请求变得非常简单,功能强大且用途广泛。
在这里插入图片描述
上面是get请求,用于从访问的地址中获取信息。还可用post请求,来向后端传入数据

result = requests.post('https://127.0.0.1:8000/detect', data = Data)

输入与输出数据格式与定义,在后端定义,见下文。

2.利用软件postman

ubuntu与windows都可用的前后端通信软件:
在这里插入图片描述

以上是通过发送数据所在路径,实现2d检测的一个功能。后端返回检测结果,输入输出都是json即字典格式

一、fastapi(创建API服务)

1.安装

注意是在win10的虚拟环境中安装,同样在win10上运行

pip install fastapi
pip install "uvicorn[standard]"

2.小示例

先创建 main.py 文件:

from typing import Optional
from fastapi import FastAPI
#创建FastAPI实例
app = FastAPI()

#创建访问路径
@app.get("/")
def read_root():#定义根目录方法
    return {"message": "Hello World"}#返回响应信息

#定义方法,处理请求
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

以上示例共包含两个 get接口,调用任意一个,都会默认执行后续的 def 函数

在终端中的使用以下命令,来启动服务:

uvicorn main:app --reload
# 注意:--reload 表示让服务器在更新代码后重新启动。仅在开发时使用该选项。

启动服务后,可在前端(如postman中访问localhost/items?=id 来进行测试)

3.完整代码

以下是完整的main.py文件,可直接用python执行来启动服务
(重点是其中 post接口以及接收文件的格式定义

from typing import Optional
import uvicorn

from fastapi import FastAPI,File
from pydantic import BaseModel
from ml.predict import load_model,Features,predict

#创建FastAPI实例
app = FastAPI()

# 自定义接收数据的结构
class hkk(BaseModel):
    file: str  
    num: int

#创建访问路径
@app.get("/")
def read_root():
    return {"message": "Hello World"}         # 访问根目录即显示

# 加载模型
models = load_model()
def test(file):
	feature = Features(file)
	return model.predict(feature)

#调用模型接口
@app.post("/detect/v2")
async def detect2(item: hkk):                 # async 表示异步执行,hkk为自定义的类
    img = item.file
    index= item.num
    res = test(img)
    return {
        "filename": file.filename,
        "attributes": (len(content),str(type(f)),str(type(content))),
        "result": res
        }


#运行
if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=8000)

测试可见前言中 postman截图,传参选 Body> raw> JSON 文件,也可用以下python文件调用:

import requests

url2 = 'http://127.0.0.1:8000/detect/v2'

filename2 = "examples/123.jpg"

files = {
    'file':filename2,
    'num':int(2)
    }

response2 = requests.post(url2, files=files)
print(response2.content)

4.拓展 (返回其他类型、数据库实战)

  1. 前端传入 json时,后端代码:
from fastapi import Body

@app.post("/login")
async def login(data = Body(None)):
   return {"data":data}                             # 除了上述自定义文件类型外,也可采用Body格式

2. 前端传入list 时,在postman 中传参选 Body> form-data ,输入一个list(含两个文件),后端代码:

from fastapi import FastAPI, Header, Body, Form
# 注意要提前 pip install python-multipart 

@app.post("/login")
async def login(username= Form(None), password = Form(None)):
  return {"data":{"username":username, "password":password}}             

3. 返回图片、网页

通过以下三个包,可返回不同类型。

from fastapi.responses import JSONResponse, HTMLResponse, FileResponse

app = FastAPI()

#创建访问路径
@app.get("/user")
def user():
  return JSONResponse( content = { "msg": "get user" },
                       status_code = 202,
                       headers = { "a": "b" })          # 给返回的header增加新的key:a
  
@app.get("/")
def user():
  html_content = " " "
  <html>
      <body><p style = "color:red"> Hello World</p></body>
  <html>
  " " "
  return HTMLResponse( content = html_content)          # 访问根目录 / 得到设置好的html网页 

@app.get("/avater")
def user():
  avater = "E:/user/123.jpg"
  return  FileResponse( avater ,filename = '123.jpg' )  # 访问目录 /avater ,得到下载提示
  return  FileResponse( avater )                        # 只显示图片

jinja2模板 返回HTML (以文件形式导入html)

from fastapi import FastAPI,Request
from fastapi.templating import Jinja2Templates          # 需要 pip install jinja2

app = FastAPI()
template = Jinja2Templates  ("pages")                   # 保存 .html 文件的文件夹

@app.get("/")
def user( req: Request ) :
    return template.TemplateResponse( "index.html" , content = { "request": req})
  1. 数据库实战

①先在 teacher.py 文件中 创建teacher类,用来模拟数据库

from pydantic import BaseModel, Field
class TeacherSchema(BaseModel):
    id: int
    name: str = Field (default = name, min_length=6)         # 规定数据格式
    course: None|str = "python 测试"                         # 旧版: Union[None,str]
    salary: float=8000
    full_time: bool=True

实例化类的两种方法:

t1 = TeacherSchema (id=3, name=“abc”, salary = “2000”…)
print (t1.dict()) # 返回字典
print (t1.json()) # 返回字符串

data = { “id”: 3 , “name”: “周老师”, “salary”: 90332}
或者从文件导入:
data = load_json(“123.json”)
t1 = TeacherSchema.parse_obj(data)

三种加载方法:

import json
import yaml

def load_json(file):
    with open(file, 'r', encoding='utf-8') as fp:
        return json.load(fp)

def save_json(data, file):
    with open(file, 'w', encoding='utf-8') as fp:
        json.dump(data, fp, ensure ascii=False)

def load_yaml(yaml_file) ->Dict:                 # 定义返回类型
    with open(yaml_file, mode ='rb') as fp:
        yaml_cont = yaml.load(fp, Loader = yaml.FullLoader)
        return yaml_cont
  1. 定制返回信息

二、nuitka打包与部署

nuitka是一个用来将python代码打包为exe可执行文件,方便其在没有相关环境的windows系统上运行的工具(也支持打包成linux系统下的可执行程序,暂未尝试)。其原理为:将部分python代码(自己写的部分)转换成C代码,以提高运行的速度;import的第三方包不进行编译,在运行时,通过一个python3x.dll的动态链接库 执行第三方包的python代码,通过这样的方式减少exe包的大小。

nuitka 适合将python 编写(基于pyqt5库)的可视化图形界面(GUI)打包,打包速度快,打包完的程序也不大,而 pyinstaller打包的程序一般都非常大,而且运行的速度很慢

1.环境与安装

环境:
conda 4.7.12
Python 3.6.13
numpy 1.16.4 (容易出错,建议不要高于此版本)
pyqt5 5.15.4

① 下载C编译器:MinGW64 8.1(这个版本最稳定)。
下载地址:https://sourceforge.net/projects/mingw-w64/files
也可使用百度盘:https://pan.baidu.com/share/init?surl=CpdGxZj2hRsU_Z0ukp6kqg#list/path=/
密码8888
在这里插入图片描述
其他两个文件保留,是nuitka的附属文件,等会会用
② 将文件3 MinGW64 8.1 解压到C盘,并添加环境变量
在这里插入图片描述
③ 打开cmd命令,使用gcc.exe --version测试是否添加上。
在这里插入图片描述

2.下载Nuitka

pip install nuitka

3.使用nuitka简单打包python代码

(1)新建一个简单的python文件,测试运行没有出错
(2)使用nuitka xxx.py命令进行打包。在打包过程中会有提示下载一个包到***\nuitka***这样一个文件夹中,下载进度条可能不动或者很慢,就可以使用 ctrl + C终止进程,手动将百度云下载的文件1解压到提示的这个文件家中
(3)重新使用nuitka xxx.py命令进行打包。还会提示下载另一个包,同样的方式将文件2解压放入
(4)重新使用nuitka xxx.py命令进行打包,这次应该就没问题了

4.使用nuitka打包pyqt5项目

参数作用:

mingw64 默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
standalone 独立环境,这是必须的(否则拷给别人无法使用)
–windows-disable-console 没有CMD控制窗口
output-dir=out 生成exe到out文件夹下面去
–show-progress 显示编译的进度,很直观
–show-memory 显示内存的占用
–include-qt-plugins=sensible,styles 打包后PyQt的样式就不会变了
–plugin-enable=qt-plugins 需要加载的PyQt插件
–plugin-enable=tk-inter 打包tkinter模块的刚需
plugin-enable=numpy 打包numpy,pandas,matplotlib模块的刚需
plugin-enable=torch 打包pytorch的刚需
–plugin-enable=tensorflow 打包tensorflow的刚需
–windows-icon-from-ico=你的.ico 软件的图标
–windows-company-name=Windows下软件公司信息
–windows-product-name=Windows下软件名称
–windows-file-version=Windows下软件的信息
–windows-product-version=Windows下软件的产品信息
–windows-file-description=Windows下软件的作用描述
–windows-uac-admin=Windows下用户可以使用管理员权限来安装
–linux-onefile-icon=Linux下的图标位置
–onefile 像pyinstaller一样打包成单个exe文件(2021年我会再出教程来解释)
–include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子
–include-module=复制比如when.py 这些以.py结尾的叫模块
–show-memory 显示内存
–show-progress 显示编译过程
–follow-imports 全部编译
nofollow-imports 不选,第三方包都不编译
–follow-stdlib 仅选择标准库
–follow-import-to=MODULE/PACKAGE 仅选择指定模块/包编译
–nofollow-import-to=MODULE/PACKAGE 选择指定模块/包不进行编译

完整命令为:

nuitka --standalone --mingw64 --show-progress --show-memory --nofollow-imports --plugin-enable=qt-plugins --include-qt-plugins=sensible,styles  --output-dir=out --windows-icon-from-ico=favicon.ico 软件的图标 start.py
// --standalone环境独立
// --mingw64选择之前下载的C编译器
// --show-progress --show-memory显示进度和内存
// --nofollow-imports所有包都不编译
// --plugin-enable=qt-plugins --include-qt-plugins=sensible,styles 添加qt插件,导入相关包
//  --output-dir=out --windows-icon-from-ico=favicon.ico 导出路径以及图标

打包完成后会生成一个文件夹,包含xx.build和xx.dist两个目录,前一个无用。后一个就是我们需要的打包好的文件夹,里面有一个exe可执行文件。继续调试添加依赖包:

调试添加包的过程:
(1)在xx.dist目录下打开cmd或者powershell(shift+鼠标右键,点击打开powershell)
(2)运行./xx.exe
(3)查看报错信息,缺少的第三方包就从D:\Anaconda3\envs\myenv(虚拟环境路径)下搜索关键字,将其复制保存到xx.dist目录下。缺少的自己的包,也将其复制过来。一步一步调试,直到把所有的依赖包全都复制到这个目录下,程序完美执行。(记得把这些依赖包复制备份)
(4)之前的命令打包的程序为了调试有一个console黑框框,正式打包的话不要console,在之前的命令中添加–windows-disable-console,具体命令为:

**感谢博主「ha_lee」的原创文章

三、Docker部署

即将完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

130道基础OJ编程题之: 29 ~ 38 道

130道基础OJ编程题之: 29 ~ 38 道 文章目录130道基础OJ编程题之: 29 ~ 38 道0. 昔日OJ编程题:29. BC23 时间转换30. BC24 总成绩和平均分计算31. BC30 KiKi和酸奶32. BC31 发布信息33. BC3 输出学生信息34. BC33 计算平均成绩35. BC34 进制AB36. BC37 网购37.BC39 争夺前五名38…

【谷粒商城】

一、项目介绍 1.微服务架构图 2.微服务划分图 二、环境搭建 1.虚拟机搭建环境 这里我买了华为云&#xff0c;没用虚拟机 华为云配置 2.Linux 安装docker docker文档&#xff1a;https://docs.docker.com/engine/install/centos/ # 1. 卸载之前的dockersudo yum remove d…

[MySql]初识数据库与常见基本操作

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 文章目录 前言 1.初识数据库 1.1 数据库概述 1.2 数据库…

mysql隔离级别RR下的行锁、临键锁、间隙锁详解及运用

一&#xff1a;mysql 锁的基本概念 锁&#xff1a;悲观锁、乐观锁 悲观锁&#xff1a;写锁 for update、读锁for share 写锁&#xff1a;只允许当前事务读写&#xff0c;其它事务全部等待&#xff0c;包括读取数据&#xff0c;锁的数据范围需要具体分析 读锁&#xff1a;允…

【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表:折线图、柱状图、饼状图

文章目录目标代码数据改写为动态Echarts引入与html结构折线图&#xff1a;orderData柱状图&#xff1a;userData饼状图&#xff1a;videoData总效果总代码:Home.vue上一篇&#xff1a;【前端】VueElement UI案例&#xff1a;通用后台管理系统-Echarts图表准备&#xff1a;axios…

公司缺人自己搞了vue又搞koa,熬夜把架子搭起来

如果有一天&#xff0c;人手紧缺&#xff0c;自己搞了前端还要搞服务端&#xff0c;今天我们把这个项目架子搭起来&#xff0c;让前端同学也可以轻松全栈开火。 技多不压身&#xff0c;活儿多了可压身啊 目录 一、上午写VUE 1、 新建一个我们的伟大项目文件夹 2、用vscode打…

程序中断方式

中断的基本概念 程序中断是指在计算机执行现行程序的过程中&#xff0c;出现某些急需处理的异常情况或特殊请求&#xff0c;CPU暂时中止现行程序&#xff0c;而转去对这些异常情况或特殊请求进行处理&#xff0c;在处理完毕后CPU又自动返回到现行程序的断点处&#xff0c;继续…

c语言之“数组”初级篇

前言 牛牛又和大家见面了&#xff0c;本篇牛牛要讲的内容是c语言中有关数组的内容。 欢迎大家一起学习&#xff0c;共同进步。 目录前言数组一、一维数组1.1 一维数组的创建1.2 一维数组的初始化1.3 一维数组的应用1.4 一维数组的存储二、二维数组2.1 二维数组创建2.2 二维数…

MySQL的select语句

SQL概述 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩荡的波…

基于android的车辆违章停放执法移动APP(ssm+uinapp+Mysql)-计算机毕业设计

车辆违章停放执法移动APP的功能已基本实现&#xff0c;主要实现首页&#xff0c;个人中心&#xff0c;市民管理&#xff0c;警察管理&#xff0c;罚单信息管理&#xff0c;缴费通知管理&#xff0c;系统管理等功能的操作系统。 论文主要从系统的分析与设计、数据库设计和系统的…

【机器学习】回归的原理学习与葡萄酒数据集的最小二乘法线性回归实例

文章目录一&#xff0c;回归1.1回归分析的基本概念1.2线性回归1.3最小二乘法1.4一元(简单)线性回归模型1.4.1随机误差项(线性回归模型)的假定条件1.4.2参数的普通最小二乘估计(0LS)1.5葡萄酒数据集的最小二乘法线性回归实例一&#xff0c;回归 1.1回归分析的基本概念 回归分析…

前端一面经典vue面试题总结

一般在哪个生命周期请求异步数据 我们可以在钩子函数 created、beforeMount、mounted 中进行调用&#xff0c;因为在这三个钩子函数中&#xff0c;data 已经创建&#xff0c;可以将服务端端返回的数据进行赋值。 ​ 推荐在 created 钩子函数中调用异步请求&#xff0c;因为在…

受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

单元测试的时候读不到resources.test中配置

背景 接手了几个老工程&#xff0c;跑单元测试的时候&#xff0c;发现数据库的配置总是走了dev环境&#xff0c; 原因是工程中分环境进行了db的配置 历史经验 指定本地环境 ActiveProfiles(“test”) 没有生效 解决 在pom文件中 新加如下配置 <build><!--单元测…

Java—类加载机制

类加载机制 我们多次提到了类加载器ClassLoader&#xff0c;本章就来详细讨论Java中的类加载机制与ClassLoader。 类加载器ClassLoader就是加载其他类的类&#xff0c;它负责将字节码文件加载到内存&#xff0c;创建Class对象。与之前介绍的反射、注解和动态代理一样&#xf…

奶制品数据可视化,去年全国奶制品产量高达3778万吨,同比增长7.1%

奶制品是生活中很常见的一种补充人体所需维生素和矿物质元素的重要食品&#xff0c;在生活中奶制品也是很常见的&#xff0c;食用最多的是牛奶。牛奶中含有非常丰富的钙质&#xff0c;睡前适当给孩子食用&#xff0c;可以补充孩子所需的钙质从而达到长高的效果。 很多小伙伴经常…

C++ 类和对象以及内存管理 练习错题总结

作者&#xff1a;小萌新 专栏&#xff1a;C初阶作业 简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;对于我们上一周学的知识做一个总结 查缺补漏 C 类和对象以及内存管理练习类和对象 (上)拷贝构造函数类和对象&#xff08;中&#xff09;重载函数运…

MySQL 主从复制与读写分离

一 概念 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分离 因为数据库的“写…

刷题笔记之九(查找输入整数二进制中1的个数+完全数计算+杨辉三角的变形+计算某字符出现次数)

目录 1. 聚合查询是进行行与行的运算合并&#xff0c;是不能和别的列放在一块查询 2. PHP数据库查询语句 3. 有group by时先执行where&#xff0c;后执行having 4. join常用两张表内连接和外连接&#xff0c;用一张表可以自连接 5. 删除数据用delete&#xff0c;删除表时…

python基于PHP+MySQL汽车展览会系统

随着我国交通事业的发展,汽车已经逐渐的成为了人们主要的代步工具之一,但是如何从众多品牌和型号的车海中选择最适合自己的那款车是很多购车人士一直以来关系的问题。为了方便车主更好的选择自己的车辆很多汽车经销商会不定期的举办一些车展来展销自己的车辆,同时也给购车用户提…