【问题标题】:Pyinstaller exe conversion fail - using lightgbm and sklearnPyinstaller exe 转换失败 - 使用 lightgbm 和 sklearn
【发布时间】:2019-08-29 05:41:36
【问题描述】:

我正在尝试使用 pyinstaller 规范将我的代码转换为 exe。 Pyinstaller 最初失败的原因如下:

main__.PyInstallerImportError: Failed to load dynlib/dll 
'C:\\Users\\...\\lightgbm\\../compile\\lib_lightgbm.dll'. Most probably this 
dynlib/dll was not found when the application was frozen.

我试图通过将以下行添加到规范中的 pathex 列表来纠正它:

'myenv\\lib\\site-packages\\lightgbm'

注意:myenv 是我为这个项目创建的 virtualenv。

这导致了 sklearn 的 ImportError。我将 sklearn 添加到隐藏的导入中。这是我的最终规格文件:

# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)

block_cipher = None


a = Analysis(['myscript.py'],
             pathex=['C:\\project_folder', 'myenv\\lib\\site-packages\\lightgbm'],
             binaries=[],
             datas=[('lib_lightgbm.dll', '.')],
             hiddenimports=['cython', 'sklearn', 'sklearn.feature_extraction','sklearn.pipeline', 'sklearn.ensemble', 'sklearn.neighbors.typedefs', 'sklearn.neighbors.quad_tree', 'sklearn.tree._utils'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='myscript',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='myscript')

这导致了一个我觉得很奇怪的错误:

File "myenv\lib\site-packages\lightgbm\sklearn.py", line 9, in <module>
ImportError: attempted relative import with no known parent package
[12692] Failed to execute script myscript

我不知道为什么它会在 lightgbm 中搜索 sklearn.py? lightgbm 里面有 sklearn.py,但我不知道如何解决这个错误。此外, dist/myscript 文件夹中没有 sklearn 文件夹。理想情况下,它应该存在。我尝试手动复制 sklearn 文件夹,但正如怀疑的那样,它没有任何区别。有人可以告诉我规范文件哪里出错了吗?

【问题讨论】:

    标签: python python-3.x scikit-learn pyinstaller lightgbm


    【解决方案1】:

    让我们回到您遇到的第一个错误。该错误表明您的应用程序被冻结时没有看到lib_lightgbm.dll

    假设您从 Windows cmd.exe 运行 pyinstaller,您可以通过将 lightgbm 的挂钩传递给 pyinstaller 来解决此问题,以便它知道从哪里获取它,例如

    pyinstaller --additional-hooks-dir dir_with_lightgbm_hook --hidden-import lightgbm myscript.py
    

    钩子的名字应该是hook-lightgbm.py,它的内容可以看这里:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/hooks/hook-numpy.py,应该是类似的东西。只需确保将库添加到二进制文件列表中,即

    binaries.append((os.path.join(os.path.dirname(
    get_module_file_attribute('lightgbm')), "lib_lightgbm.dll"), "lightgbm"))
    

    第二个"lightgbm" 参数是.dll 将被复制的位置,相对于您的分发目录,所以在您的情况下,它应该以dist\myscript\lightgbm\lib_lightgbm.dll 结尾。

    注意:通过钩子添加lib_lightgbm.dll 会使pyinstaller 将其依赖项添加到分发中,因此最好这样做而不是手动复制它。

    第二个注意事项:将分发包复制到另一台计算机时,您可能需要安装库使用的适当 Visual Studio 可再发行组件(例如 VS 2015 可再发行组件)。

    编辑:忘了提到如果你这样做,你可以删除你添加到你的 pathex 的路径。

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2020-12-05
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多