2016-08-16 14 views
0

Учитывая следующий питон программаpy2exe и cx_Oracle Не удалось загрузить cx_Oracle.pyd

testconnect.py

from sqlalchemy.dialects import oracle 
from sqlalchemy import create_engine 

url = 'oracle+cx_oracle://user:[email protected]:1521/orcl' 

e = create_engine(url) 

e.connect() 
print('Connected') 

setup.py

setup(
    options={ 
    'py2exe': { 
     'bundle_files': 1, 
     'compressed': True, 
     'dll_excludes': ['OCI.dll'], 
     'includes':['cx_Oracle'] 
    } 
    }, 
    console=["testconnect.py"], 
    zipfile=None 
) 

Я получаю следующее TraceBack

Traceback (most recent call last): 
    File "testconnect.py", line 7, in <module> 
    e = create_engine(url) 
    File "c:\Python34\lib\site-packages\sqlalchemy\engine\__init__.py", line 386, in create_engine 
    return strategy.create(*args, **kwargs) 
    File "c:\Python34\lib\site-packages\sqlalchemy\engine\strategies.py", line 75, in create 
    dbapi = dialect_cls.dbapi(**dbapi_args) 
    File "c:\Python34\lib\site-packages\sqlalchemy\dialects\oracle\cx_oracle.py", line 769, in dbapi 
    import cx_Oracle 
    File "c:\Python34\lib\site-packages\zipextimporter.py", line 109, in load_module 
    self.get_data) 
ImportError: MemoryLoadLibrary failed loading cx_Oracle.pyd: The specified module could not be found. (126) 

У меня есть три d используя 'includes' в setup.py, импортируя cx_Oracle, но безрезультатно.

Я пытается bundle_files = 3 и используя «data_files =», чтобы скопировать файл cx_Oracle.pyd в DIST каталог и я все еще получаю ту же самую проблему

Какие изменения в моей setup.py мне нужно делать, чтобы быть в состоянии захватить файл cx_Oracle.pyd так, что она будет загружать

Update:

проблема была я использую CMD консоль, которая была открыта перед установкой cx_Oracle и мгновенную клиенты построить ех с py2exe

I clo СЕПГ консоль вниз заново открыли и окно было в состоянии найти соответствующие файлы

Это теперь работает нормально на моем Windows 10 ноутбука (64 бит)

Но когда я пытаюсь развернуть этот EXE своих клиентов машины (64-битные окна 2008) я получаю все еще

D:\Milliman>testconnect.exe 
Traceback (most recent call last): 
    File "testconnect.py", line 1, in <module> 
    File "c:\Python34\lib\site-packages\zipextimporter.py", line 109, in load_module 
ImportError: MemoryLoadLibrary failed loading cx_Oracle.pyd: The specified module could not be found. (126) 

Спасибо за любую помощь заранее Энди

ответ

0

я, наконец, понял, что происходит на

Станок мы развертывали к было сервером Windows 2008 Server 64 Bit Но это было Oracle 32 разрядный клиент на нем

Я пытался развернуть py2exe питона 3.4 приложение 64 бит с Cx_Oracle 64bit было обнаружено 32-разрядное OCI.dll и не удалось загрузить

Моим решением было упаковать 64-битный Мгновенный клиент в data_files. Тогда в моем приложении изменить путь в приложении

import os 
if os.path.exists('./instant_client'): 
    pth = os.environ.get('path') 
    pth = '{0};{1}'.format('./instant_client' ,pth) 
    os.environ['path'] = pth 

Таким образом, я мог гарантировать, что cx_Oracle найдет правильный oci.dll без вмешательства глобальных путей и уже установленных оракул на этой машине

0

мгновенный клиент Oracle (или эквивалент) должен быть установлен на целевом компьютере. cx_Oracle не будет работать без него. DLL, которую он (вероятно) пытается найти, это OCI.DLL.