如何用Python将源码打包成离线可用的安装包?

在 linux 下写的 python 代码,想提供给 windows 平台使用
不想打包成 exe,感觉平台兼容性(要考虑 win7、win10 )并不好
目前的想法是:让对方装好 python,我再写一个批处理脚本,直接执行起来就好
问题在于,要能把依赖的库源码也打包进去,并能直接使用,不需要使用者再去安装

有没有现成的工具实现?
如何用Python将源码打包成离线可用的安装包?

22 回复

docker?


setuptoolswheel 打包源码是最标准的方法。先确保项目结构正确,然后创建 setup.pypyproject.toml 文件是关键。

1. 基础项目结构

my_package/
├── my_package/
│   ├── __init__.py
│   └── module.py
├── setup.py
├── pyproject.toml
└── README.md

2. 核心配置文件 setup.py 示例:

from setuptools import setup, find_packages

setup(
    name="my_package",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "requests>=2.25.1",
        "numpy>=1.19.0"
    ],
    author="Your Name",
    description="A sample package",
    python_requires=">=3.7"
)

pyproject.toml 示例:

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

3. 打包命令

# 安装构建工具
pip install setuptools wheel

# 生成分发文件
python setup.py sdist bdist_wheel

执行后会在 dist/ 目录生成 .tar.gz 源码包和 .whl 二进制包。直接 pip install dist/*.whl 就能离线安装。

总结:配好 setup.py 和 pyproject.toml 后一条命令搞定打包。

去看 linkedin 的 shiv 库, 会打包成一个 pyz 文件, 以前我就是这么让别人安装 Python, 其他源码加依赖都是用我这个 pyz
下面这个是打包 Django 成 pyz 的方式
https://shiv.readthedocs.io/en/latest/django.html

如果把官方那个 Windows 嵌入式绿色版解释器一起给对方, 甚至连安装 Python 都不需要, 这两种方式我还真都琢磨过

实际上,对于不懂 python 的人来说,仍然是打包 exe 更好
懂的人,直接源码扔过去就行

扔源码给不懂 python 的人,后面有得烦

感觉有点重口味,使用者可能是小白
多谢!去看看
之前就是打包成 exe,有点重,把 python 也打包进去了,而且我用的是 linux,在虚拟机中测试 windows 各版本 exe 能否顺利运行实在难受

给个提醒
pyinstaller win10 下打的 exe 包 并不能兼容 win7…需要在 win7 下再打一次

和 pyinstaller 比呢?

不用客气, 之前也做过相关操作而已, 部分历史代码可以看 https://github.com/ClericPy/distribute-python-on-windows 不过不知道还可以用么, 这库的主要操作就是去官网下载 embed zip, 然后解压缩, 然后打包 shiv , 然后生成一个 run.bat 用来执行, 你稍微改改就好了


两码事, shiv 的用处接近于虚拟环境的 zip 化, 打包成单个 pyz 文件以后, 整个环境的所有第三方依赖就独立于全局环境了. pyinstaller 只是一个编译工具, 而且是把解释器一起编译进去的, shiv 是不带解释器的, 所以 pyz 文件很小

你这个结论是最近的么, 之前我还真在 Windows10 上打包了给 Windows7 的人用过, 是正常通过的.

不过你说的这个情况在 3 年以前, pyinstaller 还不稳定的时候确实存在, 所以每次打包为了兼容性, 我会把需要的所有 VC100.dll 什么的一起带上, 以及 pyqt 打包会缺失的 platform.dll 也都带进去, 那年代为了兼容性真的煞费苦心了.

前段时间问过群友, 说这些 bug 在新版本 pyinstaller 都已经自动兼容好了

老哥你的头像不错哦

exe 通用性才是最好的,别搞那些歪门邪道了。pyinstaller -F win7 win8 win10 都可以正常运行 打包后的 exe 也不大

类似 virtualenv 的环境包?

https://github.com/linkedin/shiv 你看看不就知道了, PEP 441 里也讲的很清楚, 把所有第三方包打包成一个压缩文件 xx.pyz, 然后在有解释器的环境里就可以像 bin 一样直接运行了, 类似于
$ ./boto.pyz
然后根据参数, 在 pyz 文件里带上要执行的 py 文件的函数, 就可以整个项目打包成类似可执行文件的 pyz

懒得学就直接看上面那个 distwin 吧, 是一种协议, 允许 Python 解释器直接运行它, 并带上它里面包含的环境, shiv 后期也把局部环境被全局弄脏的 bug 给修复了, 变成了局部优先, 所以尽量用新版本

还有个小地方要注意, 虽然 Python 代码是跨平台的, 但是如果遇到需要编译 C 文件的库, 就没法跨平台了, 毕竟编译的玩意是不兼容的

我直接使用 Windows Embedded zip 解释器环境做开发…

然后把解释器 + 启动脚本打包给对方, 还行.

我以前这么分发过,下载个绿色版单目录 python,把自己的代码放进去,做了 BAT,搞定

  1. pyinstaller 没你说的兼容性问题
    2. pip install -r requestment.txt

<br>pip config set global.index-url <a target="_blank" href="https://pypi.tuna.tsinghua.edu.cn/simple" rel="nofollow noopener">https://pypi.tuna.tsinghua.edu.cn/simple</a><br>pip install -r requirements.txt<br>

是最近 上个月打的 不过可能是某些特定包引起的

没见过打包成 EXE 后 在 7 和 10 上有执行兼容的问题的
不过 pyinstaller 在 python 不同版本上到是有很多问题,我之前用 3.6 可以用 3.7 就不行

而且还分 x86 和 x64,也要分别打包。如果在 xp64 的打包的,在 xp32 上居然也不能运行。。。。

#15 #15 有的包莫名装不上 像 dlib 恶心人

我把依赖打包放进 packages.zip , 加上 python embeddable 版
基本就相当于 绿色版软件了

回到顶部