如何把 Python 源码打成离线使用包?

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

有没有现成的工具实现?
4886 次点击
所在节点    Python
21 条回复
solxnp
2019-10-24 10:15:06 +08:00
docker?
ClericPy
2019-10-24 10:15:27 +08:00
去看 linkedin 的 shiv 库, 会打包成一个 pyz 文件, 以前我就是这么让别人安装 Python, 其他源码加依赖都是用我这个 pyz
下面这个是打包 Django 成 pyz 的方式
https://shiv.readthedocs.io/en/latest/django.html

如果把官方那个 Windows 嵌入式绿色版解释器一起给对方, 甚至连安装 Python 都不需要, 这两种方式我还真都琢磨过
imn1
2019-10-24 10:20:44 +08:00
实际上,对于不懂 python 的人来说,仍然是打包 exe 更好
懂的人,直接源码扔过去就行

扔源码给不懂 python 的人,后面有得烦
omph
2019-10-24 11:31:12 +08:00
@solxnp 感觉有点重口味,使用者可能是小白
@ClericPy 多谢!去看看
@imn1 之前就是打包成 exe,有点重,把 python 也打包进去了,而且我用的是 linux,在虚拟机中测试 windows 各版本 exe 能否顺利运行实在难受
chengxiao
2019-10-24 11:33:38 +08:00
给个提醒
pyinstaller win10 下打的 exe 包 并不能兼容 win7....需要在 win7 下再打一次
wangyzj
2019-10-24 11:34:51 +08:00
@ClericPy 和 pyinstaller 比呢?
ClericPy
2019-10-24 11:41:19 +08:00
@omph 不用客气, 之前也做过相关操作而已, 部分历史代码可以看 https://github.com/ClericPy/distribute-python-on-windows 不过不知道还可以用么, 这库的主要操作就是去官网下载 embed zip, 然后解压缩, 然后打包 shiv , 然后生成一个 run.bat 用来执行, 你稍微改改就好了


@wangyzj 两码事, shiv 的用处接近于虚拟环境的 zip 化, 打包成单个 pyz 文件以后, 整个环境的所有第三方依赖就独立于全局环境了. pyinstaller 只是一个编译工具, 而且是把解释器一起编译进去的, shiv 是不带解释器的, 所以 pyz 文件很小
ClericPy
2019-10-24 11:43:24 +08:00
@chengxiao 你这个结论是最近的么, 之前我还真在 Windows10 上打包了给 Windows7 的人用过, 是正常通过的.

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

前段时间问过群友, 说这些 bug 在新版本 pyinstaller 都已经自动兼容好了
really28
2019-10-24 11:43:55 +08:00
老哥你的头像不错哦
pcbl
2019-10-24 11:47:29 +08:00
exe 通用性才是最好的,别搞那些歪门邪道了。pyinstaller -F win7 win8 win10 都可以正常运行 打包后的 exe 也不大
wangyzj
2019-10-24 11:50:16 +08:00
@ClericPy 类似 virtualenv 的环境包?
ClericPy
2019-10-24 11:55:56 +08:00
@wangyzj https://github.com/linkedin/shiv 你看看不就知道了, PEP 441 里也讲的很清楚, 把所有第三方包打包成一个压缩文件 xx.pyz, 然后在有解释器的环境里就可以像 bin 一样直接运行了, 类似于
$ ./boto.pyz
然后根据参数, 在 pyz 文件里带上要执行的 py 文件的函数, 就可以整个项目打包成类似可执行文件的 pyz

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

还有个小地方要注意, 虽然 Python 代码是跨平台的, 但是如果遇到需要编译 C 文件的库, 就没法跨平台了, 毕竟编译的玩意是不兼容的
Osk
2019-10-24 12:14:54 +08:00
我直接使用 Windows Embedded zip 解释器环境做开发...

然后把解释器 + 启动脚本打包给对方, 还行.
love
2019-10-24 12:26:22 +08:00
我以前这么分发过,下载个绿色版单目录 python,把自己的代码放进去,做了 BAT,搞定
l4ever
2019-10-24 12:52:15 +08:00
1. pyinstaller 没你说的兼容性问题
2. pip install -r requestment.txt
l4ever
2019-10-24 12:53:22 +08:00
```
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
```
chengxiao
2019-10-24 13:35:00 +08:00
@ClericPy 是最近 上个月打的 不过可能是某些特定包引起的
CallMeReznov
2019-10-24 13:39:22 +08:00
没见过打包成 EXE 后 在 7 和 10 上有执行兼容的问题的
不过 pyinstaller 在 python 不同版本上到是有很多问题,我之前用 3.6 可以用 3.7 就不行
castle6610
2019-10-24 15:54:54 +08:00
@chengxiao 而且还分 x86 和 x64,也要分别打包。如果在 xp64 的打包的,在 xp32 上居然也不能运行。。。。
christin
2019-10-24 15:58:29 +08:00
@l4ever #15 @l4ever #15 有的包莫名装不上 像 dlib 恶心人

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/612377

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX