【问题标题】:Pyinstaller ImportError with scipy: DLL load failedPyinstaller ImportError with scipy: DLL load failed
【发布时间】:2019-09-25 18:47:15
【问题描述】:

我有这个 Python 脚本,我想用 Pyinstaller 将其转换为 EXE 文件。

这是我的规范文件:

# -*- mode: python ; coding: utf-8 -*-

# work-around for https://github.com/pyinstaller/pyinstaller/issues/4064
import distutils
if distutils.distutils_path.endswith('__init__.py'):
    distutils.distutils_path = os.path.dirname(distutils.distutils_path)

block_cipher = None

a = Analysis(['hello-world.py'],
             pathex=['C:\\Users\\Testuser\\workspace\\hello-world'],
             binaries=[],
             datas=[ ('lib/*', '.') ],
             hiddenimports=[
               'distutils',
               'scipy._lib.messagestream',
               'sklearn.neighbors.typedefs',
               'sklearn.neighbors.quad_tree',
               'sklearn.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='hello-world',
          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,
               upx_exclude=[],
               name='hello-world')

但在 Win 10 64 位虚拟机中运行时出现此错误:

Traceback (most recent call last):
  File "hello-world.py", line 11, in <module>
  File "c:\users\testuser\workspace\hello-world\.venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
  File "site-packages\sklearn\__init__.py", line 76, in <module>
  File "c:\users\testuser\workspace\hello-world\.venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
  File "site-packages\sklearn\base.py", line 16, in <module>
  File "c:\users\testuser\workspace\hello-world\.venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
  File "site-packages\sklearn\utils\__init__.py", line 13, in <module>
  File "c:\users\testuser\workspace\hello-world\.venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
  File "site-packages\scipy\sparse\__init__.py", line 230, in <module>
  File "c:\users\testuser\workspace\hello-world\.venv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
  File "site-packages\scipy\sparse\csr.py", line 13, in <module>
ImportError: DLL load failed: The specified module could not be found.

EXE 在我构建它的机器上运行良好。将文件夹复制到 VM 中会导致上述错误。我不确定错误指的是哪个 DLL。

我猜它与错误中的路径有关,因为 VM 中不存在 c:\users\testuser\workspace\hello-world。我在这里缺少 Pyinstaller 选项吗?生成的 EXE 是否应该引用我的旧路径?

【问题讨论】:

    标签: python pyinstaller


    【解决方案1】:

    这是因为我没有安装 MKL 版本的 Numpy 和 SciPy。

    安装它们后,我将缺少的 DLL 文件添加到规范文件中:

    datas=[
        ('lib/*', '.'),
        ('.venv/Lib/site-packages/numpy/DLLs/mkl_intel_thread.dll', '.'),
        ('.venv/Lib/site-packages/numpy/DLLs/mkl_core.dll', '.'),
        ('.venv/Lib/site-packages/numpy/DLLs/mkl_def.dll', '.'),
        ('.venv/Lib/site-packages/numpy/DLLs/libiomp5md.dll', '.')
    ],
    

    现在它可以在我的虚拟机中运行了。

    希望这对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 2015-12-18
      • 2019-06-02
      • 2016-12-07
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多