1

我一直在尝试将 Hydra 与 PyInstaller 一起使用,但失败了。我创建了一个与此处示例类似的配置示例。

我注意到 PyInstaller 没有找到 hydra 包,所以我使用以下代码创建了一个简单的钩子文件 hook-hydra.py:

from PyInstaller.utils.hooks import collect_data_files, collect_submodules

datas = collect_data_files('hydra')
hiddenimports = collect_submodules('hydra')

这似乎解决了模块导入失败,但是当我尝试在命令行中运行可执行文件时,出现以下错误:

Traceback (most recent call last):
  File "lib\site-packages\hydra\_internal\utils.py", line 198, in run_and_report
  File "lib\site-packages\hydra\_internal\utils.py", line 321, in <lambda>
  File "lib\site-packages\hydra\_internal\hydra.py", line 74, in create_main_hydra2
  File "lib\site-packages\hydra\_internal\config_loader_impl.py", line 80, in __init__
  File "lib\site-packages\hydra\_internal\config_repository.py", line 22, in __init__
  File "lib\site-packages\hydra\_internal\sources_registry.py", line 30, in resolve
ValueError: No config source registered for schema pkg, supported types : []

我似乎无法弄清楚,有什么想法吗?
我正在使用 PyInstaller 3.6 和 Hydra 1.0.4

4

3 回答 3

2

在查看 PyInstaller 之后,它似乎正在尝试发现所需的包,但不知何故未能为 Hydra 做好工作。Hydra 有一些在运行时发现的内置插件,包括配置源。该错误表明配置源不是 PyInstaller 的软件包。

如果 PyInstaller 试图变得聪明并且只包含它认为直接依赖它的东西,那么 Hydra 可能会失败。尝试将所有 hydra 模块显式添加到 PyInstaller 配置文件中。

作为应用程序的替代打包方法,请查看此处的应用程序打包示例。它向您展示了安装 Hydra 应用程序的支持方法(带有一个工作示例)。

于 2020-11-30T19:25:23.437 回答
1

Hydra 不能很好地与 PyInstaller 配合使用,因为它使用pkgutil.walk_packages.

在此处查看问题和答案:Pyinstaller - 包括以编程方式导入的模块

由于您没有从库开发人员的角度解决此问题,因此使用文件data中的字段复制包.spec可以解决您的问题,尽管它有点 hacky。OmegaConf在我看来,无论是这个还是切换到都是一个很好的解决方案。

于 2021-03-15T17:50:30.863 回答
0

我遇到了类似的问题,最终不得不创建一个名为 hook-hydra.py 的 pyinstaller 挂钩并将其放在 pyinstaller hooks 文件夹中。它可能会简化为较低级别的 hydra 命名空间。利用其他钩子,我做了以下事情:

我面临的唯一问题是使用 compose overrides=[f"environment.root_path={set_root_path}"] 进行内联,抱怨 EOF .... 等。但有解决方法。记录和获取配置就像一个魅力。

from PyInstaller.utils.hooks import collect_submodules

#  Use this to get hydra internals
#  "hydra._internal.core_plugins"
# "hydra.plugins"
# 'hydra._internal.core_plugins','hydra.grammar.gen.OverrideParser'

hiddenimports = collect_submodules('hydra')
于 2022-02-04T13:52:45.413 回答