2016-04-07 7 views
3

У меня есть простой скрипт python, который импортирует cx_Oracle, а затем создает sql-запрос. Все работает отлично, когда запускается с python. У меня на вашем компьютере установлен SQL-разработчик Oracle, который является бесплатным.Pyinstaller: cx_Oracle.InterfaceError: Не удается получить дескриптор среды Oracle

Когда я затем скомпилирую программу с помощью «pyinstaller main.py», все компилируется отлично, и я также могу начать проблему. Но как только запрос SQL выполнен из этой программы, возникает следующая ошибка во время выполнения:

cx_Oracle.InterfaceError: Невозможно получить среды Oracle обрабатывать

Я попытался следующие:

  • перемещение все файлы .dll и .jar из oracle в каталог сборки, как здесь: https://sourceforge.net/p/cx-oracle/mailman/cx-oracle-users/thread/g7nbks [email protected]/
  • исключая oci.dll с помощью pyinstaller main.py --exclude oci.dll option from pyinstaller
  • проверил, что мой ORACLE_HOME правильно установлен: - C: \ Users \ nyname \ AppData \ Local \ Continuum \ Anaconda3 \ Lib \ сайт-пакеты \ instantclient_12_1

Ничего из этого не работает.

Любые предложения, что еще я могу сделать, очень ценятся.

ответ

4

Я нашел решение:

При запуске pyinstaller как обычный один файл будет отсутствовать в подборке. Необходимо вручную включены:

Для этого вам необходимо изменить строку с следующим образом:

binaries+[('oraociei12.dll','oraociei12.dll','BINARY')], 

убедитесь, что oraociei12.dll находится в текущей папке.

block_cipher = None 
    a = Analysis(['LDM-shark.py'], 
       pathex=['C:\\Users\\dicknic\\AppData\\Local\\Home\\dev\\LDM'], 
       binaries=None, 
       datas=None, 
       hiddenimports=[], 
       hookspath=[], 
       runtime_hooks=[], 
       excludes=[], 
       win_no_prefer_redirects=False, 
       win_private_assemblies=False, 
       cipher=block_cipher) 
    pyz = PYZ(a.pure, a.zipped_data, 
       cipher=block_cipher) 
    exe = EXE(pyz, 
       a.scripts, 
       a.binaries+[('oraociei12.dll','oraociei12.dll','BINARY')], 
       a.zipfiles, 
       a.datas, 
       name='mainprogram', 
       debug=False, 
       strip=False, 
       upx=True, 
       console=True) 

На втором этапе запустите pyinstaller снова, но с spec-файлом. pyinstaller mainprogram.spec

и он будет работать

+0

Я пробовал это решение, но безрезультатно. Все равно продолжайте получать ту же ошибку, когда я запускаю .exe на другой машине.Вам по-прежнему нужна установка мгновенного клиента oracle вместе с этим, или должен ли pyinstaller внедрить это в .exe по умолчанию. Пожалуйста, помогите – Imran

2

я использовал следующее правило:

a.binaries+[('oraociei12.dll','C:\\oracle\\product\\instantclient_12_1\\oraociei12.dll','BINARY')], 

Второй элемент кортежа является полный путь к DLL. Это лучше знать это ...

Существует с открытым вопрос о GitHub для проекта Pyinstaller на https://github.com/pyinstaller/pyinstaller/issues/1924

Я надеюсь, что это может помочь

+0

Да, я открыл эту проблему. Спасибо, в любом случае – Nickpick

1

описанное выше решение работает для меня, с одной небольшой модификацией - Я должен был включать в себя дополнительные DLL:

a.binaries+[('oraociei12.dll','C:\\instantclient_12_1\\oraociei12.dll','BINARY'), ('oraons.dll','C:\\instantclient_12_1\\oraons.dll','BINARY')] 

Примечание: Я бегу на Python 3.5 64 бит, PyInstaller 3.2.1, Oracle InstantClient 12.1 64-бит и Windows 7 64-бит. Надеюсь, это поможет кому-то.