简介
Nuitka是一个用Python写的Python编译器,兼容Python 2.6, 2.7, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8,及3.9等,能将Python应用打包成可执行程序或扩展模块。(Nuitka官网:http://nuitka.net/ , 源码:https://github.com/Nuitka/Nuitka)。与PyInstaller等打包工具相比,Nuitka打包出的可执行程序运行速度更快,且能够支持Numpy、Pandas等Python库。
当前最新版本 Nuitka 1.9.7. Stable releases
FastAPI 是一个用于构建 API 的现代、快速(高性能)的异步 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
(FastAPI官网:https://fastapi.tiangolo.com/,源码:https://github.com/tiangolo/fastapi)。FastAPI依赖于 Starlette(负责Web部分) 和 Pydantic(负责数据部分) 拥有极高的性能。
FastAPI推荐使用ASGI 服务器来运行服务,例如Uvicorn。
使用Nuitka将最简单的FastAPI应用打包成exe。 以打包main.py为例,用Nuitka打包后生成main.exe文件及其他dll等文件,在Windows下直接双击main.exe,启动FastAPI服务。
FastAPI应用
我们使用FastAPI官网上给的例子main.py作为要打包的应用。最后三行是在官网main.py的基础上增加的,我们将Uvicorn也在Python代码中直接调用,这样打包后就可以直接双击可执行文件启动FastAPI服务。
main.py内容如下:
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
if __name__=='__main__':
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
Nuitka打包命令
在main.py所在目录中打开命令行窗口,执行如下Nuitka打包命令:
python -m nuitka --standalone --mingw64 --show-memory --show-progress --nofollow-imports --include-package=uvicorn --include-package=click --include-package=h11 --include-package=starlette --include-package=fastapi --output-dir=o main.py
等待几分钟,即可打包完成。打包后会生成o/main.dist 目录,双击此目录下的main.exe即可启动FastAPI服务。服务启动后,在浏览器访问http://localhost:8000/,可查看到响应字符串
{“Hello”:”World”}