杭州做绒毛鉴定网站指数基金投资指南

张小明 2026/1/3 9:14:29
杭州做绒毛鉴定网站,指数基金投资指南,营销型网站建设式球磨机,合肥企业网站设计制作一、背景与目标说明为什么需要将 FastAPI 项目打包为可执行文件。对比传统部署方式#xff08;如 uvicorn main:app#xff09;与 PyInstaller 打包方式的区别。适用场景#xff1a;企业内网部署、Windows 服务、无 Python 环境的服务器等。二、环境准备Python 版本要求如 uvicorn main:app与 PyInstaller 打包方式的区别。适用场景企业内网部署、Windows 服务、无 Python 环境的服务器等。二、环境准备Python 版本要求推荐 Python 3.12.4。FastAPI 与依赖fastapi, uvicorn, pydantic, sqlalchemy, 等。安装 PyInstallerpip install pyinstaller三、FastAPI 项目结构示例展示一个典型的 FastAPI 项目结构复制代码project/├── app/│ ├── main.py│ ├── api/│ ├── core/│ ├── models/│ ├── services/│ └── __init__.py├── requirements.txt复制代码并说明 main.py 中如何启动服务例如import uvicornfrom app.main import appif __name__ __main__:uvicorn.run(app, host0.0.0.0, port8000)四、使用 PyInstaller 打包PyInstaller是目前最流行的Python打包工具之一。它可以将Python脚本打包成独立的可执行文件支持Windows、Linux和macOS平台。PyInstaller 有丰富的文档提供了详细的使用说明和常见问题解答你可以通过以下链接访问PyInstaller 官方文档https://pyinstaller.readthedocs.ioGitHub 代码库https://github.com/pyinstaller/pyinstaller这些文档和资源能帮助你深入了解 PyInstaller 的使用方式并解决在打包过程中可能遇到的问题。打包后的可执行文件可以在没有 Python 环境的机器上运行。PyInstaller 会自动分析程序的依赖关系并将所有必要的库和资源打包到一个文件或者一个文件夹中。打包过程中PyInstaller 会生成一个 .spec 文件。这个文件包含了 PyInstaller 的配置信息其中包含了构建过程的所有配置信息。你可以修改这个文件来定制打包过程。如果我们执行下面代码pyinstaller main.py或者指定更多的参数的代码pyinstaller --onefile --iconyour_icon.ico main.pyPyInstaller 都会生成一个 .spec 文件然后可以编辑 main.spec 文件以便进行更好的控制管理打包文件。虽然原则上.spec文件支持跨平台的配置不过我们在实际中往往根据不同的平台配置特定的.spec文件。你可以手动修改 .spec 文件来添加资源文件、修改导入模块、定制输出路径等。你可以通过编辑.spec 文件在EXE、COLLECT和BUNDLE块下添加一个name 为PyInstaller提供一个更好的名字以便为应用程序和dist 文件夹使用。EXE下的名字是可执行文件的名字BUNDLE下的名字是应用程序包的名字。复制代码import sysimport osfrom pathlib import Path# 本文件用于Window平台下打包整个项目生成一个独立的exe文件依赖文件松散组合# 执行命令pyinstaller main_my.spec# 打包后生成文件dist\fastapi_app\fastapi_app.exe# 运行后会在当前目录生成一个 dist 文件夹里面有 fastapi_app.exe 文件在命令行窗口运行该文件即可启动服务。if sys.platform win32:icon app/images/app.icoelif sys.platform darwin:icon app/images/app.icnsblock_cipher None# 导入 PyInstaller 模块from PyInstaller.building.build_main import Analysisfrom PyInstaller.building.build_main import PYZfrom PyInstaller.building.build_main import EXEfrom PyInstaller.building.build_main import COLLECT# Analysis: PyInstaller Analysis objecta Analysis([app/main.py],pathex[],binaries[],datas[(app/uvicorn_config.json, app),(app/.env, .),(app/images/*, app/images),(app/templates/*, app/templates),(app/uploadfiles/*, app/uploadfiles),(app/logs/*, app/logs),],hiddenimports[uvicorn, fastapi, pydantic, aiomysql, asyncio, # 确保依赖被正确包含],hookspath[],hooksconfig{},runtime_hooks[],excludes[],win_no_prefer_redirectsFalse,win_private_assembliesFalse,cipherblock_cipher,noarchiveFalse,optimize0,)# PYZ: PyInstaller PYZ objectpyz PYZ(a.pure, a.zipped_data, cipherblock_cipher)复制代码修改完成后执行以下命令来重新打包pyinstaller main_my.spec如果我们想在Windows平台生成的dist目录中生成一个启动exe和其他相关的Lib依赖库目录那么我们可以适当调整下.spec文件让它可以生成松散结构的文件目录包。复制代码exe EXE(pyz,a.scripts,[],exclude_binariesTrue,namefastapi_app,debugFalse,bootloader_ignore_signalsFalse,stripFalse,upxTrue,upx_exclude[],runtime_tmpdirNone,consoleTrue, # True 有控制台输出调试方便False 静默运行onefileFalse, # -- False取消、True使用 onefile 模式iconicon, # -- 图标路径disable_windowed_tracebackFalse,argv_emulationFalse,target_archNone,codesign_identityNone,entitlements_fileNone,)coll COLLECT(exe,a.binaries,a.zipfiles,a.datas,stripFalse,upxTrue,namefastapi_app)复制代码相当于之前在exe包中的a.binaries 和 a.datas从EXE 构造函数中移到了Collect的构造函数里面了。这样会生成下面的目录结构。image其中_internal目录包含程序的相关依赖包和文件资源。image由于打包的.spec文件指定的目录结构为松散结构使用了COLLECT构造那么可以看到 _internal / app目录下有下面的目录结构。image也就是我们前面通过 Analysis 模块指定的datas集合路径的内容。解决常见问题缺少依赖库如果打包后运行时出现缺少模块的错误可以尝试将缺少的模块加入到 hiddenimports 中或者通过 --hidden-import 选项指定大文件如果使用 --onefile 时打包后的文件太大考虑使用 --onedir 或通过压缩文件等方法进行优化。处理资源文件如果你的应用程序包含非 Python 代码的资源如图像、配置文件、数据文件等你需要通过 --add-data 选项指定资源文件的路径或者在 .spec 文件中修改 datas 选项。动态链接库如果你的应用程序依赖于特定的动态链接库如 DLL 文件或 .so 文件你需要将这些库包含到打包中。可以在 .spec 文件的 binaries 选项中指定多平台支持PyInstaller 支持 Windows、Linux 和 macOS 等多个平台但需要在相应的平台上打包。例如如果你要为 Windows 用户创建可执行文件最好在 Windows 上运行 PyInstaller 来生成 Windows 的 .exe 文件。如果在 macOS 上打包生成的文件只能在 macOS 上运行。在使用 PyInstaller 打包 FastAPI或其他 Python 应用时两个最常见、最容易混淆的参数就是--add-data或 .spec 文件中的 datas--hidden-import或 .spec 文件中的 hiddenimports当 PyInstaller 打包时它默认只会分析 Python 代码的依赖模块而不会自动包含图片、HTML 模板、配置文件等静态资源。这时就需要用 --add-data或在 .spec 文件的 datas 中定义告诉它要额外打包哪些文件或目录。这里不介绍命令行的方式只介绍.spec 文件写法imagePyInstaller 在打包时会分析你的 Python 源代码AST来判断使用了哪些模块。但有些模块是动态导入的例如通过 importlib 或字符串导入它就可能漏掉。解决办法用 --hidden-import 或者.spec文件中指定 hiddenimports 集合告诉 PyInstaller 把这些模块也打包进去如上所示。总结起来就是datas “我还有额外的文件要带上”。hiddenimports “我还有额外的模块要带上”。五、FastAPI 项目打包的处理前面介绍了一个简单的fastapi的项目结构和启动一般我们在开发的时候启动fastapi直接调用python解析器运行main.py文件即可启动常规来说main.py的启动部分函数代码如下。复制代码if __name__ __main__:# 日志配置路径config_path resource_path(app/uvicorn_config.json)# 运行 uvicorntry:config uvicorn.Config(app socket_app,reloadTrue,hostsettings.SERVER_IP,log_config config_config, # 日志配置)server uvicorn.Server(config)server.run()except Exception as e:raise e复制代码上面就是我实际项目简化版本的main.py函数的启动内容正常开发环境测试是正常的。但是通过pyinstall打包完成并运行fastapi_app.exe的时候提示找不到配置文件uvicorn_config.json。FileNotFoundError: [Errno 2] No such file or directory: app/uvicorn_config.json这个原因是打包后执行exe文件的当前路径改变了打包进去的 exe 并没有找到这个文件。首先修改 .spec 文件确保文件被打包进去在 datas 里加这一行 假设文件路径是 app/uvicorn_config.json复制代码datas [(app/uvicorn_config.json, app),(app/templates/*, app/templates),(app/static/*, app/static),(app/images/*, app/images),]复制代码这一步确保 exe 中确实包含了你的 uvicorn_config.json 文件。其次在 main.py 中使用通用的路径函数resource_path复制代码def resource_path(relative_path: str) - str:获取资源文件真实路径支持- 开发模式- PyInstaller onefile 模式- PyInstaller COLLECT (_internal) 模式if hasattr(sys, _MEIPASS): # onefile 模式# exe 解压临时目录base_path sys._MEIPASSelse:# 在松散模式下_internal 目录才是真正的数据存放处base_path os.path.dirname(sys.executable) # exe 所在目录internal_path os.path.join(base_path, _internal)if os.path.exists(internal_path):# 松散打包目录base_path internal_pathelse:# 直接开发运行时base_path os.path.abspath(.)return os.path.join(base_path, relative_path)复制代码然后修改你的 uvicorn.Config 代码替换硬编码路径为复制代码import uvicornconfig_path resource_path(app/uvicorn_config.json)config uvicorn.Config(appsocket_app,hostsettings.SERVER_IP,portsettings.SERVER_PORT,log_configconfig_path, # ✅ 动态获取正确路径)server uvicorn.Server(config)server.run()复制代码上面启动后fastapi 配置文件定位到了但是可能还会产生新的问题你可能会发现 app/uvicorn_config.json 里面配置的日志文件路径和实际不对。imageFileNotFoundError: [Errno 2] No such file or directory: .../app/logs/log.logUvicorn 在加载 uvicorn_config.json 时的日志路径是 相对进程工作目录而不是相对 uvicorn_config.json 文件本身的路径 ——这正是为什么你配置 filename: app/logs/log.log 仍然报错的根本原因。我们需要在运行前动态修正 log_config.json 内部的路径我们在加载 JSON 后动态修改其中 filename 字段的路径为打包后正确的绝对路径。修正代码后如下所示。复制代码if __name__ __main__:# 动态解析日志配置路径config_path resource_path(app/uvicorn_config.json)# 加载并修改日志配置主要对日志文件路径进行修正with open(config_path, r, encodingutf-8) as f:log_config json.load(f)# 找到其中的 file handler改写 filename 为绝对路径for handler in log_config.get(handlers, {}).values():if filename in handler:log_file handler[filename]abs_log_path resource_path(log_file)os.makedirs(os.path.dirname(abs_log_path), exist_okTrue)handler[filename] abs_log_path # 替换为绝对路径# 运行 uvicorn传入已修改的 log_config dicttry:config uvicorn.Config(app socket_app,reloadTrue,hostsettings.SERVER_IP,log_config log_config, # 日志配置,修正方式见上)server uvicorn.Server(config)server.run()except Exception as e:raise e复制代码至此所有问题都顺利解决能够正常运行起来了我们来看看FastAPI顺利启动后的效果。复制松散文件夹到服务器上双击运行即可需要也可以修改配置文件.env实现相关修改。image✅ 如果运行打包的exe 提示Missing command.其实是 uvicorn 的提示不是 PyInstaller 本身的报错。可能是你的app设置上的问题你在 main.py 里可能用了这种启动方式uvicorn.run(app.main:app, host0.0.0.0, port8000)解决方法 改成直接传入 app 对象而不是字符串路径# ✅ 改成直接传 app 对象uvicorn.run(app, host0.0.0.0, port8000)这样 uvicorn 就不会去找字符串形式的 module:app而是直接运行你传进去的 FastAPI 实例。 打包后的 exe 就能正常运行。✅ 如果提示No module named aiomysql这个问题其实是 PyInstaller 没有把 aiomysql 打包进去因为它是动态导入的PyInstaller 静态分析不到。方法 A命令行添加 hidden-importpyinstaller --onefile --name fastapi_app --hidden-import aiomysql app/main.py方法 B在 .spec 文件里加 hiddenimports找到 .spec 文件里的 Analysis改成复制代码a Analysis([app/main.py],pathex[],binaries[],datasdatas,hiddenimports[uvicorn,fastapi,pydantic,aiomysql # 加上这里],hookspath[],runtime_hooks[],excludes[],win_no_prefer_redirectsFalse,win_private_assembliesFalse,cipherblock_cipher,noarchiveFalse,)复制代码FastAPI 数据库常用依赖很多如 sqlalchemy[asyncio]、asyncpg、aiomysql 等有些也可能被漏掉。做法同样把缺失的库加到 hidden-import。复制代码hiddenimports[uvicorn,fastapi,pydantic,aiomysql,asyncpg,sqlalchemy.ext.asyncio,]复制代码✅ Data内容的写法(app/images/*, app/images)会把 app/images 下的所有文件 放到 exe 解压后的目录里路径是 app/images/...如果代码里是这样写的open(app/images/logo.png, rb)就能找到也就是始终保持相对目录的正确性。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

给素材网站做签约设计不想做了宿迁网站建设公司

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

张小明 2026/1/1 14:16:14 网站建设

青岛网站建站团队微信推广怎么做

利用模块和语言工具扩展Puppet基础设施 1. 寻找有用的Forge模块 在Puppet管理中,Forge模块是非常重要的资源。我们可以通过 http://forge.puppetlabs.com 的Web界面轻松查找所需模块。只需在搜索表单中输入要管理的软件、系统或服务名称,通常就能得到一系列合适的模块,很多…

张小明 2026/1/1 17:40:39 网站建设

网站做app收费标准深圳建业公司怎么样

摘要:MBTI(Myers-Briggs Type Indicator)作为一种广泛应用的人格测评工具,能够帮助人们更好地了解自己和他人的人格特征。本文介绍了一个基于VUE框架开发的MBTI人格测试系统,阐述了系统的需求分析、技术架构、功能模块…

张小明 2026/1/1 22:02:06 网站建设

深圳市网站开发公司没有网站可以做cpa吗

基于微信小程序的学生评教系统【源码文末联系】 三个角色(管理员,学生,教师) 效果如下: 登陆页面公告页面课程信息页面教师课程信息页面教师评价页面问卷调查页面问卷调查统计页面管理员主页面研究背景 在高等教育教学…

张小明 2025/12/31 3:26:34 网站建设

网站开发需要甲方提供什么小伙做网色网站

那天在咖啡馆里,我无意间听到两位IT经理讨论着他们公司内部网络升级的问题。其中一位提到:“我们正在考虑将现有的铜缆换成光纤,但不确定这是否真的适合我们的业务。”这句话让我意识到,对于很多企业来说,选择合适的局…

张小明 2025/12/31 3:26:32 网站建设

0000网站建设网页生成助手

Excalidraw开源协议解读:商用是否合规? 在远程协作成为常态的今天,可视化工具早已不再是“锦上添花”,而是技术团队推进项目落地的核心生产力组件。尤其在敏捷开发、架构设计和产品评审等场景中,一张随手可画、实时共享…

张小明 2025/12/31 4:44:34 网站建设