使用PyOxidizer构建独立的Python应用程序
文章目录
前言
目录对python程序进行打包方式主要有5种: py2exe、py2app,pyinstaller,cx_Freeze,nuitka。本文介绍一种新工具: PyOxidizer。
本文是使用使用PyOxidizer构建独立的Python应用程序的一个笔记。
基本按照官方教程的引导。
PyOxidizer
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项目。运行完命令,将打印相关信息及下一步该做什么的提示。
根据提示信息,依次运行:
|
|
如果一切顺利,pyoxidizer run
将启动了一个Rust可执行文件,它启动了一个交互式Python调试器!尝试输入一些Python代码:
|
|
自定义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制作了一个可执行文件!
参考
文章作者 种瓜
上次更新 2019-06-27