python打包成.exe程序的三种方式

1.pyinstaller 打包

这里以打包一个简单fastapi服务为例子

环境

python 3.6.7
pyInstaller 4.7
FastApi 0.70.0
unicorn  0.15.0

extra-hook/hoks-unicorn.py

from PyInstaller.utils.hooks import get_package_paths
datas = [(get_package_paths('uvicorn')[1], 'uvicorn')]

执行命令

pyinstaller -y --clean --additional-hooks-dir extra-hooks foo.py

foo.spec添加

hiddenimports=['uvicorn.lifespan.off','uvicorn.lifespan.on','uvicorn.lifespan',
'uvicorn.protocols.websockets.auto','uvicorn.protocols.websockets.wsproto_impl',
'uvicorn.protocols.websockets_impl','uvicorn.protocols.http.auto',
'uvicorn.protocols.http.h11_impl','uvicorn.protocols.http.httptools_impl',
'uvicorn.protocols.websockets','uvicorn.protocols.http','uvicorn.protocols',
'uvicorn.loops.auto','uvicorn.loops.asyncio','uvicorn.loops.uvloop','uvicorn.loops',
'uvicorn.logging']

执行

pyinstaller foo.spec

2.cx_Freeze

这里以打包一个简单fastapi服务为例子

环境

python 3.6.8
FastApi 0.70.0
unicorn  0.15.0
cx-Freeze 6.8.3

构建setup.py

import sys
from cx_Freeze import setup, Executable

sys.path.append(r'../')
 
os.environ['TYPE'] = "red"


build_exe_options = {'packages': ['uvicorn', 'fastapi'],# 指定包
                     'excludes': [],
                     'include_files': []# 包含的静态文件
                     }
base = None
if sys.platform == 'win32':
  base = 'Win32GUI'

setup(name = 'runFastApi',
        version = '1.0.0',
        description = '测试fastapi部署服务',
        options = {'build_exe': build_exe_options},
        executables = [Executable('foo.py', base=base)])

    foo.py

from fastapi import FastAPI
import uvicorn


app = FastAPI(
        title="SERVER",
        description="",
        version="1.0.0",
    )


@app.get("/")
async def read():
    return {"Hello": "World"}


#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
if __name__ == '__main__':
    uvicorn.run(
        app=app,
        host="0.0.0.0",
        port=9192
    )

3.pyarmor

这里以打包一个简单fastapi服务为例子

环境

python 3.6.8
FastApi 0.70.0
unicorn  0.15.0
pyarmor 7.0.3

打包

pyarmor pack foo.py

可以通过可视化界面进行混淆打包

pip install pyarmor-webui
# 启动
pyarmor-webui -p 9088
<think>我们正在处理用户的问题:如何将Python代码打包为Windows可执行的.exe文件。根据引用内容,我们可以使用多种工具,如PyInstaller、cx_Freeze、py2exe等。其中,引用[2][3][4][5]都提到了PyInstaller,并且它支持跨平台(Windows、Linux、MacOS),因此我们重点介绍PyInstaller。同时,引用[1]提到了cxfreeze和py2exe,但py2exe仅支持Windows。引用[5]还提到了打包后可能遇到的问题(如图片资源找不到)以及解决方法。步骤:1.安装PyInstaller2.使用PyInstaller打包3.处理资源文件(如果有)4.测试打包后的程序我们按照这些步骤来详细说明。</think>### 如何将Python代码打包为Windows可执行的.exe文件 要将Python程序打包成Windows可执行文件(.exe),推荐使用 **PyInstaller** 工具,它支持跨平台且操作简单。以下是详细步骤: --- #### **步骤1:安装PyInstaller** 在命令提示符或终端中执行: ```bash pip install pyinstaller ``` --- #### **步骤2:基本打包命令** 进入Python脚本所在目录,执行: ```bash pyinstaller --onefile your_script.py ``` * `--onefile`:生成单个.exe文件(否则会生成多个依赖文件) * 生成文件位于 `dist/` 目录下 --- #### **步骤3:处理资源文件(如图片、数据等)** 如果程序依赖外部资源,需额外配置: 1. **方法1:命令行指定资源路径** ```bash pyinstaller --onefile --add-data "source_path;destination_path" your_script.py ``` 示例(图片资源): ```bash pyinstaller --onefile --add-data "images/*.png;images" your_script.py ``` 2. **方法2:代码中动态定位资源路径** 在Python脚本中添加路径处理逻辑: ```python import sys import os if getattr(sys, 'frozen', False): base_path = sys._MEIPASS # 打包后的资源路径 else: base_path = os.path.dirname(__file__) image_path = os.path.join(base_path, "images/logo.png") ``` --- #### **步骤4:常用参数说明** | 参数 | 作用 | |------|------| | `--noconsole` | 隐藏命令行窗口(GUI程序专用) | | `--icon=app.ico` | 设置.exe文件图标 | | `--name=AppName` | 自定义输出文件名 | | `--splash splash.png` | 添加启动闪屏界面[^5] | --- #### **步骤5:测试与分发** 1. 在 `dist/` 目录找到生成的.exe文件 2. **测试**:复制到无Python环境的Windows机器运行 3. **分发**:将整个 `dist/` 目录压缩发送(确保包含所有依赖资源) --- #### **常见问题解决** 1. **程序找不到资源文件** → 检查 `--add-data` 路径是否正确,或确认代码中的路径处理逻辑[^5] 2. **杀毒软件误报** → 添加数字签名或使用 `--key` 参数加密(需安装 `tinyaes`) 3. **文件过大** → 使用虚拟环境安装最小依赖: ```bash python -m venv venv venv\Scripts\activate pip install minimal_dependencies pyinstaller --onefile your_script.py ``` --- #### **其他工具对比** | 工具 | 特点 | 适用场景 | |------|------|----------| | **PyInstaller** | 跨平台、简单易用 | 推荐首选 | | **cx_Freeze** | 支持多平台[^1] | 需编写setup.py配置 | | **py2exe** | 仅限Windows[^1] | 旧项目兼容 | > 提示:PyInstaller 支持大多数主流库(如PyQt、Pandas),但需测试复杂依赖[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值