2016-08-16 1 views
0

Compte tenu du programme python suivantpy2exe et cx_Oracle Échec du chargement cx_Oracle.pyd

de 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') 

de setup.py

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

Je reçois le retraçage suivant

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) 

J'ai trie d en utilisant 'includes' dans le setup.py, en important cx_Oracle mais en vain.

J'ai essaie bundle_files = 3 et en utilisant « data_files = » pour copier le fichier cx_Oracle.pyd dans le répertoire dist et je reçois toujours la même question

Quels changements à mon setup.py dois-je faire pour être en mesure de capture le fichier cx_Oracle.pyd afin qu'il chargera

Mise à jour:

le problème est que j'utilisait une console de cmd qui était ouvert avant l'installation et cx_Oracle client instantanée pour construire l'exe avec py2exe

Je clo sed la console vers le bas et les fenêtres a rouvert ses portes a pu trouver les fichiers appropriés

Cela va maintenant OK sur mon ordinateur portable de Windows 10 (64 bits)

Mais lorsque je tente de déployer ce EXE à mes clients la machine (64 bit windows 2008) Je reçois le texte suivant encore

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) 

Merci pour toute aide à l'avance Andy

Répondre

0

J'ai finalement compris ce qui se passait

La machine que nous déployons pour WAS Windows 2008 Server 64 bits mais il avait client bit Oracle 32 sur elle

je tentais de déployer python py2exe 3.4 application 64 bits avec Cx_Oracle 64bit cela trouvait le 32 bits OCI.dll et ne pas charger

Ma solution était de package le client instantané 64 bits dans les fichiers de données. Puis dans mon application modifier le chemin dans l'application

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

De cette façon, je pourrais garantir que le cx_Oracle trouverait la OCI.DLL correcte sans interférer avec les chemins globaux et l'oracle déjà installé sur cette machine

0

le client instantané Oracle (ou équivalent) doit être installé sur la machine cible. cx_Oracle ne fonctionnera pas sans cela. La DLL qu'il est (probable) essayant de trouver est OCI.DLL.