«Ошибка импорта: сбой загрузки DLL» при преобразовании «.py файла» (с «import rasterio») в «.exe файл» с помощью pyinstaller - PullRequest
0 голосов
/ 04 июля 2019

У меня есть файл python (версия 3.7) с именем test.py, который я хочу преобразовать в test.exe, используя pyinstaller. Когда я использую команду

pyinstaller test.py

успешно создает test.exe. Но когда я пытаюсь выполнить файл test.exe с помощью командной строки, я получаю следующую ошибку:

"Traceback (most recent call last):
  File "test.py", line 1, in <module>
  File "c:\users\user1\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\rasterio\__init__.py", line 29, in <module>
ImportError: DLL load failed: The specified module could not be found.
[460] Failed to execute script test"   

Пройдя через аналогичный пост на сайте, я попробовал разные варианты, такие как:

(i) Первый вариант: в пути C:\Users\user1\Anaconda3\Lib\site-packages\PyInstaller\hooks я добавил hook-rasterio.py, содержащий hiddenimports=['rasterio', 'rasterio._shim'], а затем попытался

pyinstaller -F test.py

но все равно я получаю вышеуказанную ошибку.

(ii) Второй вариант: внутри файла test.spec в hiddenimports=[] я добавил rasterio и rasterio._shim, а затем создал test.exe, используя pyinstaller, но проблема все еще сохраняется.

Мой test.py выглядит так:

import rasterio
print("It's Done....")

Может кто-нибудь предложить необходимые вещи, которые можно было бы сделать при решении проблемы.

1 Ответ

0 голосов
/ 04 июля 2019

rasterio - сложная библиотека, и она зависит от многих внешних библиотек. Ваша ошибка - ошибка загрузки DLL, которая означает, что в ней отсутствуют некоторые файлы DLL, требуемые для rasterio. Я предлагаю вам следовать процессу установки в здесь и убедиться, что вы правильно установили rasterio в вашей среде conda (используйте для этого новый env).

Далее, проверьте, что rasterio импортируется без проблем с чем-то вроде:

import traceback
try:
    import rasterio
    print("Import OK!")
except ImportError:
    print("Import Error!")
    traceback.print_exc()
input()

Далее установите PyInstaller и используйте приведенный ниже файл спецификации:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['C:\\Users\\Masoud\\Desktop\\test'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
a.datas += Tree('C:\\Users\\Masoud\\Anaconda3\\envs\\testEnv\\Lib\\site-packages\\rasterio\\', prefix='rasterio')
a.datas += Tree('C:\\Users\\Masoud\\Anaconda3\\envs\\testEnv\\Lib\\xml', prefix='xml')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=False,
          runtime_tmpdir=None,
          console=True )

В приведенном выше сценарии я перенесу целые библиотеки rasterio и xml в исполняемый файл, поскольку PyInstaller не может разрешить импорт модуля. Не забудьте изменить пути в соответствии с вашими настройками.

Наконец, сгенерируйте свой исполняемый файл с помощью:

pyinstaller test.spec
...