惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
小众软件
小众软件
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
Jina AI
Jina AI
博客园 - 【当耐特】
V
Visual Studio Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
量子位
IT之家
IT之家
G
Google Developers Blog
V
V2EX
The GitHub Blog
The GitHub Blog
月光博客
月光博客
GbyAI
GbyAI

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟
使用PyOxidizer构建独立的Python应用程序
种瓜 · 2019-06-27 · via 夜行人

文章目录

前言

目录对python程序进行打包方式主要有5种: py2exe、py2app,pyinstaller,cx_Freeze,nuitka。本文介绍一种新工具: PyOxidizer。

本文是使用使用PyOxidizer构建独立的Python应用程序的一个笔记。

基本按照官方教程的引导。

PyOxidizer是indygreg开源了一个项目,用于构建独立的Python应用程序。文档在这儿

有趣的是, PyOxidizer本身基于Rust, 个中原因indygreg这篇文章里做了阐述。

安装

为了使用PyOxidizer,首先需要按照Rust环境。

安装Rust

Rust版本要求: 1.33+.

可以按照rust官方官方的引导说明来安装。

我在MacOS环境里工作,我准备使用rustup,方便将来管理Rust版本,安装过程非常简单: brew install rustup

如果你也使用rustup,安装好之后接下来运行:rustup-init

安装完成之后检查版本:

1
2
➜  ~ rustc --version
rustc 1.35.0 (3c235d560 2019-05-20)

安装PyOxidizer

cargo install pyoxidizer

安装完成后,尝试运行它:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
➜  ~ pyoxidizer
PyOxidizer 0.1.2
Gregory Szorc <gregory.szorc@gmail.com>
Build and distribute Python applications

USAGE:
    pyoxidizer [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    add                             Add PyOxidizer to an existing Rust project. (EXPERIMENTAL)
    analyze                         Analyze a built binary
    build                           Build a PyOxidizer enabled project
    build-artifacts                 Process a PyOxidizer config file and build derived artifacts
    help                            Prints this message or the help of the given subcommand(s)
    init                            Create a new Rust project embedding Python.
    python-distribution-extract     Extract a Python distribution archive to a directory
    python-distribution-licenses    Show licenses for a given Python distribution
    run                             Build and run a PyOxidizer application
    run-build-script                Run functionality that a build script would perform

使用

创建项目

pyoxidizer init pyapp

该命令将创建一个支持嵌入Python的Rust项目。运行完命令,将打印相关信息及下一步该做什么的提示。

根据提示信息,依次运行:

1
2
3
cd pyapp
pyoxidizer build # 第一次运行会下载对应平台的Python解释器
pyoxidizer run

如果一切顺利,pyoxidizer run将启动了一个Rust可执行文件,它启动了一个交互式Python调试器!尝试输入一些Python代码:

1
2
>>> print("hello, world")
hello, world

自定义Python和打包行为

自定义

项目根目录里有一个自动生成的pyoxidizer.toml文件,该文件决定默认运行时行为。

找到[[embedded_python_run]]部分, 这部分决定Python解释器启动时要执行的操作,调整为:

1
2
3
[[embedded_python_run]]
mode = "eval"
code = "import uuid; print(uuid.uuid4())"

现在我们告诉解释器启动时运行:eval(import uuid; print(uuid.uuid4())

pyoxidizer run输出的结果为: 4ef94bc0-4cbe-4404-9269-0690fec68094

打包第三方库

接下来,让我们试着打包现有的Python应用程序!

我们试着打包第三方库:pyflakes

编辑配置文件:pyoxidizer.toml,使得:

1
2
3
[[packaging_rule]]
type = "pip-install-simple"
package = "pyflakes==2.1.1"

以及

1
2
3
[[embedded_python_run]]
mode = "eval"
code = "from pyflakes.api import main; main()"

这将告诉PyOxidizer你要安装pyflakes的2.1.1版本。在构建时,会运行pip install pyflakes==2.1.1,并将它们添加到生成的二进制文件中。我们试试看:pyoxidizer run -- --help

新的pyoxidizer.toml文件应该类似于:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Multiple [[python_distribution]] sections elided for brevity.

[[build]]
application_name = "pyflakes"

[[embedded_python_config]]
raw_allocator = "system"

[[packaging_rule]]
type = "stdlib-extensions-policy"
policy = "all"

[[packaging_rule]]
type = "stdlib"
include_source = false

[[packaging_rule]]
type = "pip-install-simple"
package = "pyflakes==2.1.1"

[[embedded_python_run]]
mode = "eval"
code = "from pyflakes.api import main; main()"

成功为pyflakes制作了一个可执行文件!

参考