Python 现代化打包应用到 exe 的方式?

2022-06-12 20:34:14 +08:00
 LeeReamond

前一段时间看到 PyOxidizer 这个项目,但是大概看了看文档也没看懂,看起来似乎是个打包程序,但似乎要和 rust 关联,我想打包 python 程序为什么和 rust 产生关系了?

pyinstaller 打包方式已经持续多年了,比如一个简单的需求是,我有一个 main.py 的程序,有若干 pip 依赖,我现在希望产生一个 exe ,让它在没有安装 python 的电脑上也能运行。pyinstaller 能用,但是实在也说不上好用,隐藏源码之类的功能就不奢求了,打包完后提示缺少依赖也是常事,在加上启动速度实在不敢恭维。

py 虚拟机相对于 java 虚拟机启动起来还是要快一些,比如运行

python -c "print('hello world')"

这种命令无论在 win 还是 linux 上都可以 0.1 秒内返回结果。而 venv 之类的虚拟环境本身体积也不是很大,大概只有十几 MB ,为啥不能有个好用的打包系统。。。后来有个 nuitika 打包,但是还是使用起来不方便,我想随手发布个小脚本,打包还要 gcc 环境。。

5809 次点击
所在节点    Python
27 条回复
1779930755cmy0
2022-06-14 10:37:07 +08:00
就我的经验来说,@Osk 这位老哥的办法是最简单、可操作性最强且不容易出问题的,我在这里稍微补充一点细节:
1. 从 python 官网下载 embedded 版本的 python 压缩包,目前最后支持 win7 的版本是 3.8 ,我个人用的是 3.8.7 。
2. 解压 python embedded 压缩包(假设解压到 c:/python )以后,找到 [python38._pth] 这个文件并打开,去掉 [import site] 前面的 [#] 。
3. 下载 [get-pip.py] 文件,放到 python 文件夹里,打开 cmd ,进入 c:/python 目录,执行 python get-pip.py ,跑完以后 python embedded 就有了使用 pip 安装模块的能力,之后就可以在 pycharm 中安装模块了,比如 pyqt5 。如果使用 cmd 安装模块,需要先 cd c:/python ,然后 python -m pip install 模块名。
4. 写程序的过程中要注意,在 main.py 中引用自己写的.py 文件时可能会失败,这是环境变量的问题,我的解决办法是在程序开头添加临时环境变量,如果自己写的需要引用的.py 文件跟 main.py 在同一路径下的话,可以这么写:
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__))),这一句的意思是把 main.py 所在路径临时添加到系统变量中。
5. 写完 python 程序以后,写一个批处理 bat 文件,假设文件名为“启动程序.bat”,用来执行 main.py 程序,这是因为环境变量里没有嵌入式 python 的路径,需要指定 python.exe 的路径。一个简单的写法如下:
cd c:/python
python "c:/python/Projects/hello world/main.py"
pause
6. 如果不喜欢程序打开后伴随的 cmd 控制台窗口,可以去搜索隐藏控制台的 bat 代码,写在“启动程序.bat”开头即可。
7. 将整个 python 文件夹压缩,发给其他人,随便他解压到哪个地方,只要双击“启动程序.bat”,就能运行你写好的 py 程序,到此真正实现免配置、便携化 python 程序的目的。
1779930755cmy0
2022-06-14 12:05:50 +08:00
ungrown
2022-06-14 14:31:34 +08:00
@Buges #7 pyinstaller 不支持 musl 吗,我没玩过,问问
LeeReamond
2022-06-14 21:58:23 +08:00
@1779930755cmy0 感觉不错,通用性很强,但是 bat 启动软件可能给用户观感比较差,大家还是感觉 exe 比较正规
Osk
2022-06-16 19:14:33 +08:00
@LeeReamond WinRAR 打包成 exe, 设置好 logo, 启动文件, 就成了 exe 了.
或者找一个安装框架, 给桌面 /开始菜单创建一个快捷方式也行.
再不济, 用其他语言编译个 exe 启动器也行

/狗头 /
bluehammer2019
2022-06-17 19:25:08 +08:00
remrem
2022-06-20 17:51:34 +08:00
@1779930755cmy0 感谢你和 osk 的分享,很实用

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

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

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

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

© 2021 V2EX