Day 10 打包 python 程序-2

打包 python 程序是个大坑,现在没有一个 python 打包器能完美打包所有 python 程序,尤其是机器学习函式库。

我觉得难以打包的其中一个原因是因为 python 的特性...
动态语言,经常使用其他语言的函式库,以及执行期间 import。
总之,pyinstaller 抓不到一些执行时需要的 dll,那麽来找吧。


我们可以根据这篇的解法,获得 mkl_ 的 dll 位置,并加入到打包程序中。
https://stackoverflow.com/questions/35478526/pyinstaller-numpy-intel-mkl-fatal-error-cannot-load-mkl-intel-thread-dll

但两边的环境不同,他 的mkl_ dll 放在 /Lib/site-packages/numpy/core,而我的在

(以下的 spec 档是 pyinstaller 在第一次打包时建立的设定档,虽然附档名是.spec 但实际上是当 python 执行的。)
打开 a01_flask_server.spec 并修改。

# a01_flask_server.spec
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


from PyInstaller import log as logging 
from PyInstaller import compat
from os import listdir

mkldir = compat.base_prefix + "\\Library\\bin" 
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('mkl_')] 

a = Analysis(['a01_flask_server.py'],
             pathex=['D:\\vscode\\ithelp'],
             binaries=binaries,
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
...

Analysis 中的 binaries 会在打包时将指定的档案(二进位档)放入资料夹,而在这里我们就是要将缺少的 dll 放进去。
他的参数格式是 [("来源档案或资料夹路径", "目标资料夹夹路径"), ("另一个来源", "另一个目标")...]

重新打包後让我们再试着执行一次...

工作一样,在你的 python 安装路中找到并加进去。
binaries.append((compat.base_prefix +
"\Lib\site-packages\tensorflow\lite\experimental\microfrontend\python\ops",
"tensorflow\lite\experimental\microfrontend\python\ops"))

下一个

这次是函式库不是档案,所以要加的是这里

hiddenimports=["keras.api"]

下一个

hiddenimports=["keras.api", "keras.api._v2"]

下一个...我还以为我需要把 keras 所有子模块都写进去。
这次是我程序的问题,它找不到要读取的模型。

预设情况如果读取档案没写路径,会寻找执行时时的当下路径(如果使用捷径开启就会是捷径的路径),
这里要把他改成相对於程序的路径。
并且在打包时自动包进去。

# a06_mnist_api.py
import os
saved_model_path = os.path.dirname(__file__) + "\\mnist" + "\\mnist"

# a00_flask_server.spec
a = Analysis(['a01_flask_server.py'],
             pathex=['D:\\vscode\\ithelp'],
             binaries=binaries,
             datas=[("mnist", "mnist")],
             hiddenimports=["keras.api", "keras.api._v2"],
             hookspath=[],
             ...

这样应就好...了?

我想得太美了。

剩下的明天继续...


<<:  Day23-pytorch(6)iris资料集示范classifier模型pytorch完整训练过程

>>:  Day 25 - Watch os 开发学习2(Button)

Vue.js 从零开始:This 是什麽?

学习JavaScript也有一阵子,当有人问起This是什麽,都无法解释的很清楚,代表理解的不够彻底...

EP 31: Testing TopStore App (Beta) for iOS and Android

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

27. 解释 CSS 的 BFC(Block Formatting Context)

Formatting Context 所有的HTML元素,在CSS里都可以视为box(盒子),在No...

[Day21] 第二十一章 - 使用Ajax来做登入API界接

前言 昨天我们把登入页面套上了bootstrap 我们这次把jqury补上去 接者透过ajax做登入...

[Day25] 在 Codecademy 学 React ~ 终於来到 Hook 的世界 ‧ useState 篇 (2)

前言 快开天窗了先把目前进度 po 出来再说orz 今天文章重点在 setState 搭配 ...p...