周日趣事:看看python脚本怎么打包成可执行文件(应用)

背景

同事A需要在一台只能访问局域网的mac mini上运行一个python脚本,脚本依赖了一些模块,有numpy这种三方模块,也有自己开发的本地模块,而mac mini上除了python,什么都没有安装。同事B接到求助后三下五除二生成了一个可执行文件,堪称满分答案。但对于具体细节,同事B表示很复杂说不清,于是就有了姑娘的周日趣事。

工具

浅百度一下,迅速定位到工具为PyInstaller, 查到官网上有以下描述,确认就是你没错!

PyInstaller bundles a Python application and all its dependencies into a single package. The user can run the packaged app without installing a Python interpreter or any modules.

从首页的描述来看,使用简直不能再简单:
安装工具:

pip install -U pyinstaller

使用工具:

pyinstaller your_program.py

真的这么简单吗?

如果同我一样顺手用了import numpy做demo的话,就不是了!
我的脚本tryPyinstaller.py:

import numpy as np
print("6 / 3 = " + str(np.divide(6,3)))

使用工具:

pyinstaller --onefile tryPyinstaller.py

运行生成的应用:

(base) leixiaoyues-MacBook-Pro:~ leixiaoyue$ /Users/leixiaoyue/Code/YuePythonScript/tryPyinstaller/dist/tryPyinstaller ; exit;
INTEL MKL ERROR: dlopen(/private/var/folders/fq/qx5csyvd54x6p60p38qvqfpm0000gn/T/_MEI8YGfHc/libmkl_intel_thread.1.dylib, 0x0009): Library not loaded: '@rpath/libiomp5.dylib'
Referenced from: '/private/var/folders/fq/qx5csyvd54x6p60p38qvqfpm0000gn/T/_MEI8YGfHc/libmkl_intel_thread.1.dylib'
Reason: tried: '/usr/local/lib/libiomp5.dylib' (no such file), '/usr/lib/libiomp5.dylib' (no such file).
Intel MKL FATAL ERROR: Cannot load libmkl_intel_thread.1.dylib.
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

为什么会缺库啊?!这件事情还不得而知,选择暂时放过自己,先来解决问题现象!这就引出了PyInstaller一个非常重要的机制——钩子!

钩子🪝万岁

浅百度一下,又在官网中看到有“Understanding PyInstaller Hooks”一节,大概感到有救。钩子是编程中用来实现可拓展性的一个常用技巧。钩子已在!缺什么钩什么!

接下来看看PyInstsaller里具体怎么钩,抄 StackOverflow上的作业。

  1. 新建钩子脚本hook-numpy.py,把要钩的库列在里面

from PyInstaller import log as logging
from PyInstaller import compat

from os import listdir

mkldir = compat.base_prefix + "/lib"
logger = logging.getLogger(name)
logger.info("MKL installed as part of numpy, importing that!")
binaries = [(mkldir + "/" + mkl, '.') for mkl in listdir(mkldir) if mkl.startswith('libmkl_')]

  1. 通过参数additional-hooks-dir告诉程序新增钩子的路径,参数clean是为了清除之前运行的缓存,多个香炉多个鬼,清一清没啥不好

pyinstaller --additional-hooks-dir=. --clean --onefile tryPyinstaller.py

双击应用,成功运行

Last login: Sun Apr 9 15:02:31 on ttys008

The default interactive shell is now zsh.
To update your account to use zsh, please run chsh -s /bin/zsh.
For more details, please visit https://support.apple.com/kb/HT208050.
/Users/leixiaoyue/Code/YuePythonScript/tryPyinstaller/dist/tryPyinstaller/tryPyinstaller ; exit;
(base) leixiaoyues-MacBook-Pro:~ leixiaoyue$ /Users/leixiaoyue/Code/YuePythonScript/tryPyinstaller/dist/tryPyinstaller/tryPyinstaller ; exit;
6 / 3 = 2.0
logout

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

运行是真的慢……

工程师的工具箱里又多了什么

首先,是把所有依赖统统打包成应用的思路。这在帮完全外行的朋友写软件时超级有用,这样简单直接的思路以前还真没想到过。
再就是又一次领略了🪝提供可拓展性的魅力。

解决旧问题带来新问题

为什么打包出来的程序运行那么那么慢……
为什么打包numpy会缺libmkl_xxx一系列Math Kernal Library?
Hook 真的是个好的命名吗?韩语후킹(hooking),日语フック(hook),直接用音译,大陆译作“钩子”,不能在亚洲圈获得统一的翻译,往往是命名不够准确的一个表现……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容