使用 Pyinstaller 时找不到隐藏的导入 Tensorflow 包

Posted

技术标签:

【中文标题】使用 Pyinstaller 时找不到隐藏的导入 Tensorflow 包【英文标题】:Hidden import Tensorflow package not found when using Pyinstaller 【发布时间】:2021-09-02 17:56:42 【问题描述】:

我正在尝试将我的对象检测器 python 项目转换为可执行文件,但我总是收到这些警告并且我的可执行文件无法运行。

64422 WARNING: Hidden import "tensorflow._api.v2.compat.v1.estimator" not found!
64425 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v2.keras.metrics" not found!
64843 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.applications.resnet50" not found!
64844 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.applications.resnet" not found!
64845 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v2.keras.backend" not found!
64857 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.estimator.tpu" not found!
64859 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v1.keras.applications.mobilenet" not found!
64892 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.applications.vgg19" not found!
64894 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v2.keras.preprocessing.text" not found!
64896 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.estimator.tpu.experimental" not found!
64899 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.applications.resnet_v2" not found!
64956 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v1.keras.wrappers.scikit_learn" not found!
64957 WARNING: Hidden import "tensorflow._api.v2.compat.v2.compat.v2.keras.applications.resnet50" not found!
64958 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.wrappers.scikit_learn" not found!
65073 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v2.keras.applications.imagenet_utils" not found!
65073 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v2.keras.datasets.cifar100" not found!
65238 WARNING: Hidden import "tensorflow._api.v2.compat.v1.compat.v1.keras.optimizers" not found!

我的项目结构是

- project folder
  - venv
  - main.py
  - detect.py

detect.py 里面我有以下导入

import tensorflow as tf
from tensorflow.python.saved_model import tag_constants
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession

tensorflow module 可以在 venv 文件夹内的 site-packages 中找到

我尝试过的解决方案是添加--hidden-import tensorflow 标志,如Question 中所述

pyinstaller --hidden-import tensorflow --onefile main.py

我也尝试过this approach,方法是使用hook-tensorflow.py 文件创建hooks 目录

- project folder
   - venv
   - hooks
      - hook-tensorflow.py
   - main.py
   - detect.py

hook-tensorflow.py

from PyInstaller.utils.hooks import collect_all


def hook(hook_api):
    packages = [
        'tensorflow'
    ]
    for package in packages:
        datas, binaries, hiddenimports = collect_all(package)
        hook_api.add_datas(datas)
        hook_api.add_binaries(binaries)
        hook_api.add_imports(*hiddenimports)

然后发出这个终端命令

pyinstaller --additional-hooks-dir=hooks --onefile main.py

但是,同样的警告仍然存在,我的可执行文件不会运行。

【问题讨论】:

【参考方案1】:

您可以尝试使用python=3.8 创建虚拟环境,如果您使用的是anaconda,则运行命令conda create -n env1 python=3.8 在此之后使用环境只需运行 conda activate env1 并仅安装您的应用程序所需的包。

这样做的好处是节省了编译EXE文件的时间,而且文件大小也相对较小。

我遇到了同样的问题,这个技巧对我有用。

您可能不必也使用它来添加挂钩。

记得在环境中安装pyinstaller,并且在编译EXE之前一定要激活

【讨论】:

这个如何解决隐藏导入的问题?

以上是关于使用 Pyinstaller 时找不到隐藏的导入 Tensorflow 包的主要内容,如果未能解决你的问题,请参考以下文章

获取 ValueError:使用 PyInstaller 模块时找不到脚本“/src/add2vals.py”

您如何解决“未找到隐藏的导入!” pyinstaller 中针对 scipy 的警告?

pyinstaller:确定 Windows 服务中 socket.io 和 aiohttp 的隐藏导入

使用本地 JSON 文件导入时找不到模块

pyinstaller 找不到自定义导入的模块

在 Angular 中使用 SystemJs 导入时找不到模块