打包 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)
学习JavaScript也有一阵子,当有人问起This是什麽,都无法解释的很清楚,代表理解的不够彻底...
Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...
Formatting Context 所有的HTML元素,在CSS里都可以视为box(盒子),在No...
前言 昨天我们把登入页面套上了bootstrap 我们这次把jqury补上去 接者透过ajax做登入...
前言 快开天窗了先把目前进度 po 出来再说orz 今天文章重点在 setState 搭配 ...p...