ImportError: ошибка загрузки DLL - только при использовании модуля IBM DB - PullRequest
0 голосов
/ 06 августа 2020

Я наблюдаю сообщение об ошибке «DLL LOAD FAILED» при запуске моего файла python как exe-файла на сервере, где подключение Python или inte rnet недоступно. Другие мои exe-файлы не имеют проблем, это файл, содержащий модуль IBM DB, является единственным, у которого есть проблемы.

Я попробовал решение, приведенное здесь: ImportError: Ошибка загрузки DLL: указанный модуль не может быть найден - IBM DB2 - Все еще столкнулся с проблемой.

Когда я запускаю этот же exe-файл на моем локальном компьютере (ноутбуке) - он работает, но на сервере - не работает.

Ниже приведена команда, которую я использовал для конвертировать exe-файл:

pyinstaller -y --additional-hooks-dir=. --hidden-import ibm_db_sa.ibm_db --hidden-import ibm_db_dbi --hidden-import ibm_db --add-binary C:\Python\Python37\Lib\site-packages\ibm_db_dlls\ibm_db.dll;.\ibm_db_dlls --onefile mypythonfile.py

Ниже сообщение об ошибке при запуске exe-файла:

E:\SuspenseReport>mypythonfile.exe
c:\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py:62
3: MatplotlibDeprecationWarning:
The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and wil
l be removed in 3.3.
Traceback (most recent call last):
  File "mypythonfile.py", line 14, in <module>
    import ibm_db
  File "c:\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importe
rs.py", line 623, in exec_module
  File "site-packages\ibm_db.py", line 10, in <module>
  File "site-packages\ibm_db.py", line 9, in __bootstrap__
  File "imp.py", line 342, in load_dynamic
ImportError: DLL load failed: The specified module could not be found.
[16360] Failed to execute script mypythonfile

Версии:

Python Version: 3.7.6
Pyinstaller Version: 3.6
ibm-db Version: 3.0.1
os : Windows

Пожалуйста, посоветуйте, что может быть сделано, чтобы исправить эту проблему.

1 Ответ

1 голос
/ 06 августа 2020

Я обновил другой ответ, на который вы ссылаетесь.

Если ваш код python явно не использует SQLAlchemy, вам не нужно включать его в командную строку сборки pyinstaller. Если вы используете SQLAlchemy, вам могут потребоваться дополнительные перехватчики, упомянутые в другом ответе.

Поскольку вы развертываете свой EXE на другом имени хоста (сервере), чем ваша среда сборки (рабочая станция), целевой сервер может не уже установлен клиент Db2.

python ibm_db использует CLI (интерфейс уровня вызова) для доступа к базам данных Db2. Db2-клиент предоставляет такой интерфейс командной строки. Если у вас нет Db2-клиента, доступного для ibm_db, тогда модуль ibm_db не загрузится, и вы увидите свой симптом. Когда вы устанавливаете ibm_db, по умолчанию он добавляет на вашу рабочую станцию ​​небольшой Db2-клиент (без установки), называемый clidriver, но он не будет включен pyinstaller в ваш пакет.

Если на сервере нет Db2- клиент уже установлен, и вы НЕ используете sh для отдельной установки и настройки Db2-клиента, тогда вы можете перестроить свой пакет pyinstaller, включив в него clidriver, который модуль python ibm_db предоставляет по умолчанию. Чтобы перестроить, вам необходимо включить дополнительные параметры командной строки для pyinstaller.

Чтобы включить clidriver, сначала найдите его местоположение с помощью команды pip show ibm_db, а затем найдите значение Location: и добавьте к этому пути значение \clidriver. Это полный путь к вашему clidriver, например c:\path\to\clidriver

Затем повторно запустите вашу предыдущую команду pyinstaller с дополнительным параметром

--add-data="c:\path\to\clidriver;.\clidriver "

Если ваш код python зависит от настроенных извне DSN (вместо длинных строк подключения внутри кода), и если вы создали подходящий файл db2dsdriver.cfg, содержащий эти DSN и любые параметры, необходимые для каждой базы данных или DSN, вам также необходимо будет включить это db2dsdriver.cfg файл в вашем пакете. Если ваш код не полагается на внешне настроенные DSN, этот шаг может не понадобиться. Вы также можете запустить сценарий db2cli командных строк на сервере для настройки db2dsdriver.cfg вместо его объединения. , если это ваше предпочтение.

Если вам нужно использовать исполняемый файл odbcad32.exe на имени хоста целевого сервера для настройки DSN Db2, вам также потребуется запустить командную строку установки clidriver на целевом сервере после вы доставляете свой EXE-файл, созданный pyinstaller, запустив его исполняемый файл db2cli install -setup из clidriver \ bin dire ctory как администратор. Если вам НЕ нужно использовать графические интерфейсы, такие как odbcad32.exe, на целевом имени хоста, этот шаг можно пропустить.

Если вы используете зашифрованные соединения с Db2 (например, SSL / TLS) или аутентификацию на основе сертификатов, тогда ваш пакет может также включать соответствующие сертификаты и / или хранилища ключей / тайники. Таким образом, вам могут потребоваться дополнительные параметры для вашей сборки pyinstaller.

На целевом сервере может быть полезно добавить полный каталог clidriver \ bin в переменную среды PATH. Убедитесь, что каталоги, содержащие любые файлы конфигурации или файлы данных, доступны для чтения любому пользователю или группе, которым требуется доступ к ним.

Кроме того, имейте в виду, что IBM обновляет свое программное обеспечение clidriver пару раз в год с учетом требований безопасности. исправления и исправления ошибок вместе с новыми функциями. После тестирования ваш EXE-файл, созданный pyinstaller, должен быть обновлен и распространен, чтобы включить обновленный clidriver.

...