便携式Python二进制文件
项目描述
便携式Python二进制文件
Portable-Python 是一个CLI(以及Python库)工具,可以从源代码编译Python二进制文件,并将其解压缩到任何文件夹中,从而无需进一步操作即可使用(即:无需运行“安装程序”)。
动机
这里的想法是允许自动化系统
轻松获取Python二进制文件,并在沙盒/工作站/笔记本电脑/实例中使用
检查任何Python安装,并指出其可移植性如何,以及它使用了哪些共享或非标准库
安装
portable-python 是一个常规的 Python CLI,可以使用以下方式安装:
pickley install portable-python portable-python --help portable-python inspect /usr/bin/python3
或者 pipx
pipx install portable-python portable-python inspect /usr/bin/python3
使用 pip install(CI 构建器可能会这样做)
/usr/bin/python3 -mvenv /tmp/pp /tmp/pp/bin/python -mpip install portable-python /tmp/pp/bin/portable-python --help /tmp/pp/bin/portable-python inspect /usr/bin/python3
支持的操作系统
可移植的 Python 二进制文件可以构建为 Linux 和 MacOS(Intel/M1/M2)。
目前 Windows 不受支持,欢迎贡献。
Python 二进制文件可以生成“可移植的”(静态链接,可以从任何二进制文件解包的文件夹中运行),或者使用 --prefix(构建到预定的文件夹中,如 /apps/pythonM.m)
操作系统 |
可移植的 |
–prefix |
---|---|---|
Linux |
✅ |
✅ |
Macos |
✅ |
✅ |
Windows |
❌ |
❌ |
构建可移植的 cpython
一旦 portable-python 安装完毕
构建二进制文件
cd some-temp-folder portable-python build 3.9.7 ls -l dist/cpython-3.9.7-macos-arm64.tar.gz
将其解压到某个位置
tar -C ~/tmp/versions/ -xf dist/cpython-3.9.7-macos-arm64.tar.gz ls -l ~/tmp/versions/
即可使用
~/tmp/versions/3.9.7/bin/python --version
注意,您可以使用 --dryrun 模式来检查将要执行的操作而无需实际执行
$ portable-python --dryrun build 3.9.7 INFO selected: xz openssl gdbm (3 modules) xz:5.2.5 openssl:1.1.1k gdbm:1.18.1 INFO Platform: macos-x86_64 ... -------------- -- xz:5.2.5 -- -------------- Would download https://tukaani.org/xz/xz-5.2.5.tar.gz Would untar build/sources/xz-5.2.5.tar.gz -> build/components/xz INFO env PATH=build/deps/bin:/usr/bin:/bin INFO env MACOSX_DEPLOYMENT_TARGET=10.14 Would run: ./configure --prefix=build/deps --enable-shared=no --enable-static=yes ... ... ------------------- -- cpython:3.9.7 -- ------------------- Would download https://pythonlang.cn/ftp/python/3.9.7/Python-3.9.7.tar.xz Would untar build/sources/Python-3.9.7.tar.xz -> build/components/cpython ... Would run: ./configure --prefix=/ppp-marker/3.9.7 --enable-optimizations ... Would run: /usr/bin/make Would run: /usr/bin/make install DESTDIR=build ... Would tar build/3.9.7 -> dist/cpython-3.9.7-macos-x86_64.tar.gz
库
可移植 Python 可以用作 Python 库来调用构建,或检查安装情况。
从 Python 代码中调用构建
from portable_python import BuildSetup setup = BuildSetup("cpython:3.9.7") setup.compile()
从 Python 代码中调用检查
from portable_python.inspector import PythonInspector inspector = PythonInspector("/usr/bin/python3") print(inspector.represented()) problem = inspector.full_so_report.get_problem(portable=True) if problem: print("oops, it is not portable!: %s" % problem)
从源代码开始,欢迎贡献!
git clone https://github.com/codrsquad/portable-python.git cd portable-python python3 -mvenv .venv .venv/bin/pip install -r requirements.txt -r tests/requirements.txt .venv/bin/pip install -e . .venv/bin/portable-python --help .venv/bin/portable-python inspect /usr/bin/python3 tox -e py311 tox -e style
构建文件夹结构
portable-python 使用此文件结构(build/ 和 dist/ 文件夹可配置)
build/ ppp-marker/3.9.7/ # Full installation (after build completes) components/ # Builds of statically compiled extension modules are here deps/ # --prefix=.../deps passed to all component ./configure scripts sources/ openssl-1.1.1k.tar.gz # Downloaded artifacts (downloaded only once) dist/ cpython-3.9.7-macos-arm64.tar.gz # Ready-to-go portable binary tarball
指导原则
专注于一件事情:编译可移植的 Python,并验证其确实可移植,在(可配置的)./dist/ 文件夹中产生结果,仅此而已
无补丁:C 编译尽可能简单,不修改上游源代码。仅依赖于 make/configure 脚本,通常通过诸如 --enable-shared=no 之类的操作
构建得到验证,编写能够检查 Python 安装并检测其是否可移植的代码是这项工作的一个重要部分(以及为什么不可移植,如果确实如此)。
仅支持 Python 的最新几个非 EOL 版本(不支持历史版本)
随着时间的推移,这个工具的代码将不断进化,以确保最新的 Python 版本可以构建(但不会担心旧版本仍然可以构建)
对于本项目本身
代码是纯 Python,它是一个 CLI,有一个名为 portable-python 的入口点
可以在调试器中运行
100% 测试覆盖率,有一个 --dryrun 模式来帮助进行测试/调试/快速查看将要执行的操作
没有 shell 脚本(这些难以维护/测试/调试)
可以 pip install 并重用
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
portable_python-1.9.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a4e985cd225e17f0e2651e2c2443714f0c18114436b11204c6c211dd68f956de |
|
MD5 | fff0bab2252ba8bf2057c3cd2ed441c7 |
|
BLAKE2b-256 | e7c308dab0bcf1a9f57acdc2b67d21934574e2fabe2657bb081226a809f2fc1a |
portable_python-1.9.3-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4bf3af2e2b3780c3cbb0ed10593c61962c92bbdc7afdad12d9cac3de494dfdf1 |
|
MD5 | 817e6d51c8f199bcbea5ee38576ed4d0 |
|
BLAKE2b-256 | 744fe0f6fc590f473b376fc1525edf307607bee1700ade46b8b6c020b1de77d7 |