PyOxidizer:将 Python 应用打包成单一可执行文件的神器
off999 2025-06-12 15:12 61 浏览 0 评论
三、PyOxidizer 基本使用
使用 PyOxidizer 打包应用的基本流程如下:
1. 创建新项目
首先,我们使用 pyoxidizer init 命令创建一个新的 PyOxidizer 项目:
pyoxidizer init myapp这会创建一个名为 myapp 的目录,其中包含 PyOxidizer 所需的配置文件和基本项目结构。
2. 了解配置文件
项目中最重要的文件是 pyoxidizer.bzl,这是一个使用 Starlark 语言(类似 Python)编写的配置文件。这个文件定义了如何打包你的 Python 应用。
让我们看一个简单的配置示例:
def make_dist():
return default_python_distribution()
def make_exe(dist):
policy = dist.make_python_packaging_policy()
policy.resources_location = "in-memory"
python_config = dist.make_python_interpreter_config()
python_config.run_module = "myapp"
exe = dist.to_python_executable(
name="myapp",
packaging_policy=policy,
config=python_config,
)
# 添加我们的Python包
exe.add_python_package("myapp")
return exe
def make_embedded_resources(exe):
return exe.to_embedded_resources()
def make_install(exe):
files = FileManifest()
files.add_python_resource(".", exe)
return files
register_target("exe", make_exe)
register_target("resources", make_embedded_resources, depends=["exe"], default=True)
register_target("install", make_install, depends=["exe"], default=True)
resolve_targets()3. 添加你的 Python 代码
在项目目录中创建你的 Python 代码。例如,我们可以创建一个简单的 myapp 包:
myapp/
__init__.py
main.py在 main.py 中写入:
def main():
print("Hello from PyOxidizer!")
if __name__ == "__main__":
main()然后在 __init__.py 中添加:
from .main import main
if __name__ == "__main__":
main()4. 构建可执行文件
现在,我们可以使用 PyOxidizer 构建可执行文件:
cd myapp
pyoxidizer build成功构建后,可执行文件通常位于 build/ 目录下。
四、进阶配置
PyOxidizer 提供了丰富的配置选项,让我们来看一些常用的进阶配置:
1. 打包第三方依赖
如果你的应用依赖第三方库,只需在配置文件中添加:
# 添加特定的包
exe.add_python_package("requests")
exe.add_python_package("numpy")
# 或者从requirements.txt添加
exe.add_python_requirements(Path("requirements.txt"))2. 设置入口点
你可以设置应用的入口点,有多种方式:
# 运行模块
python_config.run_module = "myapp"
# 运行特定脚本
python_config.run_filename = "myapp/main.py"
# 运行Python代码
python_config.run_command = "from myapp import main; main()"3. 资源处理
你可以控制 Python 资源的存储位置:
# 资源加载到内存中(启动快,内存占用大)
policy.resources_location = "in-memory"
# 资源保存在文件系统中(启动稍慢,内存占用小)
policy.resources_location = "filesystem-relative:lib"注意事项:内存模式启动更快,但会占用更多内存;文件系统模式启动略慢,但内存占用较少。
五、实战示例:打包一个简单的 Web 应用
让我们看一个实际的例子,将一个使用 Flask 的简单 Web 应用打包:
1.首先创建项目结构:
webapp/
__init__.py
app.py
static/
style.css
templates/
index.html2.编写 Flask 应用代码 (app.py):
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def main():
app.run(host='0.0.0.0', port=8000)
if __name__ == '__main__':
main()3.创建 PyOxidizer 项目并配置:pyoxidizer init flask-webapp
cd flask-webapp4.修改
pyoxidizer.bzl 文件:def make_dist():
return default_python_distribution()
def make_exe(dist):
policy = dist.make_python_packaging_policy()
policy.resources_location = "in-memory"
python_config = dist.make_python_interpreter_config()
python_config.run_module = "webapp"
exe = dist.to_python_executable(
name="webapp",
packaging_policy=policy,
config=python_config,
)
# 添加我们的应用和依赖
exe.add_python_package("webapp")
exe.add_python_package("flask")
# 处理静态文件
exe.add_python_resources(exe.pip_install(["--no-binary", ":all:", "flask"]))
return exe
# 其他函数保持不变...5.构建应用:pyoxidizer build小贴士:对于包含静态文件的 Web 应用,有时需要特别关注资源的打包方式,确保静态文件和模板能够被正确加载。
六、常见问题与解决方案
1. 打包大小问题
PyOxidizer 生成的可执行文件可能比较大,因为它包含了 Python 解释器。如果想减小体积,可以:
# 在配置中排除不需要的模块
policy.include_distribution_resources = False
policy.include_test = False2. 平台兼容性
通常需要在目标平台上构建可执行文件,或使用交叉编译:
# 指定目标平台
build_target = 'x86_64-pc-windows-msvc'3. 调试问题
如果打包的应用出现问题,可以启用调试:
# 启用调试输出
python_config.debug_build = True七、总结与展望
PyOxidizer 是一个强大的 Python 打包工具,它解决了 Python 应用分发的许多痛点。通过将 Python 解释器和应用代码打包成单一可执行文件,不仅简化了分发过程,还提高了启动性能。
虽然 PyOxidizer 相对较新,但它代表了 Python 打包领域的一个重要进步。随着工具的发展,相信它会变得更加强大和易用。
对于有打包需求的 Python 开发者来说,PyOxidizer 绝对值得一试!
相关推荐
-
- cad2014破解版激活教程(cad 2014破解版怎么样激活)
-
步骤如下:1.打开CAD2014,点击激活,勾选同意协议之后它会告诉您,您的序列号是错误的,这时点击关闭等一会再点击激活即可;2.在激活界面中选择“我拥有一个Autodesk激活码”;3.启动对应版本的XFORCEKeygen32bit...
-
2026-02-03 15:51 off999
- electricity(electricity翻译)
-
electricity[英][??lek?tr?s?ti][美][?l?k?tr?s?ti,?il?k-]n.电力;电流,静电;高涨的情绪;紧张;以上结果来自金山词霸例句:1.Article31pow...
- 腾讯游戏实名认证中心官网(腾讯游戏实名认证官网首页)
-
QQ游戏实名注册和防沉迷系统设置方法:第一步:登录实名注册和防沉迷系统网站(http://jkyx.qq.com/web2010/authoriz.htm);第二步:填写实名制信息;第三步:等待审核,...
- qlv文件怎么转换成mp4(qlv文件怎么转换成mp4格式)
-
要将QLV文件转换为MP4文件,您可以使用专业的视频转换软件。首先,下载并安装一个可靠的视频转换器,如Handbrake或AnyVideoConverter。然后,打开软件并导入您要转换的QLV文...
- 央视网cctv5直播(央视网cctv5直播在线观看)
-
看CCTV5直播可以直接选择网页看直播或者使用播放器看直播频道。1、打开e网站2、打开我打圈的,电视直播,但是这里面有些台没有,比如浙江卫视3、然后在左边可以选择你想看的台4、方法2,打开网络主流播放...
- qq历史版本官方下载(qq历史旧版本大全)
-
蟹妖。我用的小米手机,可以双开两个应用,你可以搞两个一样版本的qq。小米手机,还可以手机分身,一个手机不同的解锁方式进入不同的系统,第一个系统你可以安最新版本的qq,另一个系统你可以安装其他版...
- 一个人看的片免费高清大全(一个人看的片免费高清大全在线观看)
-
推荐“爱奇艺App手机版”。它是百度旗下的高清电影站,有许多最新最热的正版大片供免费观看,爱奇艺APP是一款集视频、商城、购票、阅读、直播、泡泡粉丝社区等多种服务于一体的移动软件。爱奇艺手机版为用户提...
- 搜狗翻译app下载(搜狗翻译app下载安装)
-
有啊,点击输入框弹出搜狗键盘,进入搜狗工具栏最左边的图标,进入加号,添加中英互译。1、首先确认是否电脑键盘按键出现问题,可以通过win+r调出运行,输入osk。2、调出虚拟键盘测试虚拟键盘是否可以正常...
- 女生付费和男生聊天(女生找男生聊天掉价吗)
-
不管在什么情况下女生好像都处在优势,因为只听说过娶不到媳妇儿的单身汉,还没有听说过嫁不出去的丑媳妇儿。所以一般这种交友聊天软件就是奔着让男人出钱来的,而且这类软件骗子太多,几乎都是机器人,或者是各种托...
- 腾讯公司版权所有(腾讯开放版权)
-
你好!其实这个很好理解,就是版权公司把这个音乐的管理、销售权限(独家版权)授权给了腾讯,腾讯可以把音乐对外进行转授权。所以你看有一些腾讯独家版权的歌,为什么其他音乐平也台会有呢?其实就是腾讯授予的。因...
- 智能语音机器人(智能语音机器人哪个最好)
-
1、小米的小爱小爱的智能应用随着近年来的不断升级,在很多手机应用都带来了智能新体验。像移动支付、生活购物、查询信息、打开应用等等,小爱智能语音识别就可以帮你解决。用户还可以自己创建快捷方式,进行语音交...
- adobe lightroom(adobe lightroom for ipad破解版)
-
adobelightroom是一款非常不错的在线教育软件,adobelinghtroom这款软件具有资源管理,资源共享,在线学习,在线考试,成绩管理,教学管控,教学互动,效果评估等等功能,可以为用户提...
- 解压软件免费(电脑解压软件免费)
-
WinRAR压缩软件winrar压缩软件界面友好,WINRAR现在最好的压缩工具。使用方便,压缩率和速度方面都有很好的表示。其压缩率比之WINZIP之流要高。winrar压缩软件采用了比Zip更...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
