2009-07-20 10 views
6

Il mio programma python (Python 2.6) funziona correttamente quando lo eseguo utilizzando l'interprete Python, si collega al database Oracle (10g XE) senza errori . Tuttavia, quando lo compilo usando py2exe, la versione eseguibile fallisce con "Impossibile acquisire l'handle di ambiente Oracle" alla chiamata a cx_Oracle.connect().Errore nel collegamento a Oracle dal programma py2exe: impossibile acquisire l'handle di ambiente Oracle

Ho provato quanto segue con nessuna gioia:

  • Oracle Instant client 10g e 11g
  • Oracle XE client
  • reinstallare cx_Oracle-5.0.2-10g.win32-py2.6. msi
  • impostazione ORACLE_HOME così come PATH
  • un altro computer con solo un client Oracle e l'exe
  • varie opzioni per buildi ng l'exe (nessuna compressione e/o utilizzando il file zip)

mio TestCase:

testora.py:

import cx_Oracle 
import decimal # needed for py2exe to compile this correctly 

def testora(): 
    """testora 

    >>> testora.testora() 
    <cx_Oracle.Connection to [email protected]:1521/orcl> 
    X 
    """ 
    orcl = cx_Oracle.connect('scott/[email protected]:1521/orcl') 
    print orcl 
    curs = orcl.cursor() 
    result = curs.execute('SELECT * FROM DUAL') 
    for (dummy,) in result: 
     print dummy 

if __name__ == '__main__': 
    testora() 

build_testora.py:

from distutils.core import setup 
import py2exe, sys 

sys.argv.append('py2exe') 

setup(
    options = {'py2exe': { 
     'bundle_files': 2, 
     'compressed': True 
     }}, 
    console = [{'script': "testora.py"}], 
    zipfile = None 
    ) 

risultati:

C:\Python26\working>python testora.py 
<cx_Oracle.Connection to [email protected]:1521/orcl> 
X 

C:\Python26\working>python build_testora.py py2exe 
C:\Python26\lib\site-packages\py2exe\build_exe.py:16: DeprecationWarning: the se 
ts module is deprecated 
    import sets 
running py2exe 
creating C:\Python26\working\build 
creating C:\Python26\working\build\bdist.win32 
creating C:\Python26\working\build\bdist.win32\winexe 
creating C:\Python26\working\build\bdist.win32\winexe\collect-2.6 
creating C:\Python26\working\build\bdist.win32\winexe\bundle-2.6 
creating C:\Python26\working\build\bdist.win32\winexe\temp 
*** searching for required modules *** 
*** parsing results *** 
*** finding dlls needed *** 
*** create binaries *** 
*** byte compile python files *** 
byte-compiling C:\Python26\lib\StringIO.py to StringIO.pyc 
byte-compiling C:\Python26\lib\UserDict.py to UserDict.pyc 
byte-compiling C:\Python26\lib\__future__.py to __future__.pyc 
byte-compiling C:\Python26\lib\_abcoll.py to _abcoll.pyc 
byte-compiling C:\Python26\lib\_strptime.py to _strptime.pyc 
byte-compiling C:\Python26\lib\_threading_local.py to _threading_local.pyc 
byte-compiling C:\Python26\lib\abc.py to abc.pyc 
byte-compiling C:\Python26\lib\atexit.py to atexit.pyc 
byte-compiling C:\Python26\lib\base64.py to base64.pyc 
byte-compiling C:\Python26\lib\bdb.py to bdb.pyc 
byte-compiling C:\Python26\lib\bisect.py to bisect.pyc 
byte-compiling C:\Python26\lib\calendar.py to calendar.pyc 
byte-compiling C:\Python26\lib\cmd.py to cmd.pyc 
byte-compiling C:\Python26\lib\codecs.py to codecs.pyc 
byte-compiling C:\Python26\lib\collections.py to collections.pyc 
byte-compiling C:\Python26\lib\copy.py to copy.pyc 
byte-compiling C:\Python26\lib\copy_reg.py to copy_reg.pyc 
byte-compiling C:\Python26\lib\decimal.py to decimal.pyc 
byte-compiling C:\Python26\lib\difflib.py to difflib.pyc 
byte-compiling C:\Python26\lib\dis.py to dis.pyc 
byte-compiling C:\Python26\lib\doctest.py to doctest.pyc 
byte-compiling C:\Python26\lib\dummy_thread.py to dummy_thread.pyc 
byte-compiling C:\Python26\lib\encodings\__init__.py to encodings\__init__.pyc 
creating C:\Python26\working\build\bdist.win32\winexe\collect-2.6\encodings 
byte-compiling C:\Python26\lib\encodings\aliases.py to encodings\aliases.pyc 
byte-compiling C:\Python26\lib\encodings\ascii.py to encodings\ascii.pyc 
byte-compiling C:\Python26\lib\encodings\base64_codec.py to encodings\base64_cod 
ec.pyc 
byte-compiling C:\Python26\lib\encodings\big5.py to encodings\big5.pyc 
byte-compiling C:\Python26\lib\encodings\big5hkscs.py to encodings\big5hkscs.pyc 

byte-compiling C:\Python26\lib\encodings\bz2_codec.py to encodings\bz2_codec.pyc 

byte-compiling C:\Python26\lib\encodings\charmap.py to encodings\charmap.pyc 
byte-compiling C:\Python26\lib\encodings\cp037.py to encodings\cp037.pyc 
byte-compiling C:\Python26\lib\encodings\cp1006.py to encodings\cp1006.pyc 
byte-compiling C:\Python26\lib\encodings\cp1026.py to encodings\cp1026.pyc 
byte-compiling C:\Python26\lib\encodings\cp1140.py to encodings\cp1140.pyc 
byte-compiling C:\Python26\lib\encodings\cp1250.py to encodings\cp1250.pyc 
byte-compiling C:\Python26\lib\encodings\cp1251.py to encodings\cp1251.pyc 
byte-compiling C:\Python26\lib\encodings\cp1252.py to encodings\cp1252.pyc 
byte-compiling C:\Python26\lib\encodings\cp1253.py to encodings\cp1253.pyc 
byte-compiling C:\Python26\lib\encodings\cp1254.py to encodings\cp1254.pyc 
byte-compiling C:\Python26\lib\encodings\cp1255.py to encodings\cp1255.pyc 
byte-compiling C:\Python26\lib\encodings\cp1256.py to encodings\cp1256.pyc 
byte-compiling C:\Python26\lib\encodings\cp1257.py to encodings\cp1257.pyc 
byte-compiling C:\Python26\lib\encodings\cp1258.py to encodings\cp1258.pyc 
byte-compiling C:\Python26\lib\encodings\cp424.py to encodings\cp424.pyc 
byte-compiling C:\Python26\lib\encodings\cp437.py to encodings\cp437.pyc 
byte-compiling C:\Python26\lib\encodings\cp500.py to encodings\cp500.pyc 
byte-compiling C:\Python26\lib\encodings\cp737.py to encodings\cp737.pyc 
byte-compiling C:\Python26\lib\encodings\cp775.py to encodings\cp775.pyc 
byte-compiling C:\Python26\lib\encodings\cp850.py to encodings\cp850.pyc 
byte-compiling C:\Python26\lib\encodings\cp852.py to encodings\cp852.pyc 
byte-compiling C:\Python26\lib\encodings\cp855.py to encodings\cp855.pyc 
byte-compiling C:\Python26\lib\encodings\cp856.py to encodings\cp856.pyc 
byte-compiling C:\Python26\lib\encodings\cp857.py to encodings\cp857.pyc 
byte-compiling C:\Python26\lib\encodings\cp860.py to encodings\cp860.pyc 
byte-compiling C:\Python26\lib\encodings\cp861.py to encodings\cp861.pyc 
byte-compiling C:\Python26\lib\encodings\cp862.py to encodings\cp862.pyc 
byte-compiling C:\Python26\lib\encodings\cp863.py to encodings\cp863.pyc 
byte-compiling C:\Python26\lib\encodings\cp864.py to encodings\cp864.pyc 
byte-compiling C:\Python26\lib\encodings\cp865.py to encodings\cp865.pyc 
byte-compiling C:\Python26\lib\encodings\cp866.py to encodings\cp866.pyc 
byte-compiling C:\Python26\lib\encodings\cp869.py to encodings\cp869.pyc 
byte-compiling C:\Python26\lib\encodings\cp874.py to encodings\cp874.pyc 
byte-compiling C:\Python26\lib\encodings\cp875.py to encodings\cp875.pyc 
byte-compiling C:\Python26\lib\encodings\cp932.py to encodings\cp932.pyc 
byte-compiling C:\Python26\lib\encodings\cp949.py to encodings\cp949.pyc 
byte-compiling C:\Python26\lib\encodings\cp950.py to encodings\cp950.pyc 
byte-compiling C:\Python26\lib\encodings\euc_jis_2004.py to encodings\euc_jis_20 
04.pyc 
byte-compiling C:\Python26\lib\encodings\euc_jisx0213.py to encodings\euc_jisx02 
13.pyc 
byte-compiling C:\Python26\lib\encodings\euc_jp.py to encodings\euc_jp.pyc 
byte-compiling C:\Python26\lib\encodings\euc_kr.py to encodings\euc_kr.pyc 
byte-compiling C:\Python26\lib\encodings\gb18030.py to encodings\gb18030.pyc 
byte-compiling C:\Python26\lib\encodings\gb2312.py to encodings\gb2312.pyc 
byte-compiling C:\Python26\lib\encodings\gbk.py to encodings\gbk.pyc 
byte-compiling C:\Python26\lib\encodings\hex_codec.py to encodings\hex_codec.pyc 

byte-compiling C:\Python26\lib\encodings\hp_roman8.py to encodings\hp_roman8.pyc 

byte-compiling C:\Python26\lib\encodings\hz.py to encodings\hz.pyc 
byte-compiling C:\Python26\lib\encodings\idna.py to encodings\idna.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp.py to encodings\iso2022_jp.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp_1.py to encodings\iso2022_jp 
_1.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp_2.py to encodings\iso2022_jp 
_2.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp_2004.py to encodings\iso2022 
_jp_2004.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp_3.py to encodings\iso2022_jp 
_3.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_jp_ext.py to encodings\iso2022_ 
jp_ext.pyc 
byte-compiling C:\Python26\lib\encodings\iso2022_kr.py to encodings\iso2022_kr.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_1.py to encodings\iso8859_1.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_10.py to encodings\iso8859_10.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_11.py to encodings\iso8859_11.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_13.py to encodings\iso8859_13.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_14.py to encodings\iso8859_14.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_15.py to encodings\iso8859_15.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_16.py to encodings\iso8859_16.p 
yc 
byte-compiling C:\Python26\lib\encodings\iso8859_2.py to encodings\iso8859_2.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_3.py to encodings\iso8859_3.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_4.py to encodings\iso8859_4.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_5.py to encodings\iso8859_5.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_6.py to encodings\iso8859_6.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_7.py to encodings\iso8859_7.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_8.py to encodings\iso8859_8.pyc 

byte-compiling C:\Python26\lib\encodings\iso8859_9.py to encodings\iso8859_9.pyc 

byte-compiling C:\Python26\lib\encodings\johab.py to encodings\johab.pyc 
byte-compiling C:\Python26\lib\encodings\koi8_r.py to encodings\koi8_r.pyc 
byte-compiling C:\Python26\lib\encodings\koi8_u.py to encodings\koi8_u.pyc 
byte-compiling C:\Python26\lib\encodings\latin_1.py to encodings\latin_1.pyc 
byte-compiling C:\Python26\lib\encodings\mac_arabic.py to encodings\mac_arabic.p 
yc 
byte-compiling C:\Python26\lib\encodings\mac_centeuro.py to encodings\mac_centeu 
ro.pyc 
byte-compiling C:\Python26\lib\encodings\mac_croatian.py to encodings\mac_croati 
an.pyc 
byte-compiling C:\Python26\lib\encodings\mac_cyrillic.py to encodings\mac_cyrill 
ic.pyc 
byte-compiling C:\Python26\lib\encodings\mac_farsi.py to encodings\mac_farsi.pyc 

byte-compiling C:\Python26\lib\encodings\mac_greek.py to encodings\mac_greek.pyc 

byte-compiling C:\Python26\lib\encodings\mac_iceland.py to encodings\mac_iceland 
.pyc 
byte-compiling C:\Python26\lib\encodings\mac_latin2.py to encodings\mac_latin2.p 
yc 
byte-compiling C:\Python26\lib\encodings\mac_roman.py to encodings\mac_roman.pyc 

byte-compiling C:\Python26\lib\encodings\mac_romanian.py to encodings\mac_romani 
an.pyc 
byte-compiling C:\Python26\lib\encodings\mac_turkish.py to encodings\mac_turkish 
.pyc 
byte-compiling C:\Python26\lib\encodings\mbcs.py to encodings\mbcs.pyc 
byte-compiling C:\Python26\lib\encodings\palmos.py to encodings\palmos.pyc 
byte-compiling C:\Python26\lib\encodings\ptcp154.py to encodings\ptcp154.pyc 
byte-compiling C:\Python26\lib\encodings\punycode.py to encodings\punycode.pyc 
byte-compiling C:\Python26\lib\encodings\quopri_codec.py to encodings\quopri_cod 
ec.pyc 
byte-compiling C:\Python26\lib\encodings\raw_unicode_escape.py to encodings\raw_ 
unicode_escape.pyc 
byte-compiling C:\Python26\lib\encodings\rot_13.py to encodings\rot_13.pyc 
byte-compiling C:\Python26\lib\encodings\shift_jis.py to encodings\shift_jis.pyc 

byte-compiling C:\Python26\lib\encodings\shift_jis_2004.py to encodings\shift_ji 
s_2004.pyc 
byte-compiling C:\Python26\lib\encodings\shift_jisx0213.py to encodings\shift_ji 
sx0213.pyc 
byte-compiling C:\Python26\lib\encodings\string_escape.py to encodings\string_es 
cape.pyc 
byte-compiling C:\Python26\lib\encodings\tis_620.py to encodings\tis_620.pyc 
byte-compiling C:\Python26\lib\encodings\undefined.py to encodings\undefined.pyc 

byte-compiling C:\Python26\lib\encodings\unicode_escape.py to encodings\unicode_ 
escape.pyc 
byte-compiling C:\Python26\lib\encodings\unicode_internal.py to encodings\unicod 
e_internal.pyc 
byte-compiling C:\Python26\lib\encodings\utf_16.py to encodings\utf_16.pyc 
byte-compiling C:\Python26\lib\encodings\utf_16_be.py to encodings\utf_16_be.pyc 

byte-compiling C:\Python26\lib\encodings\utf_16_le.py to encodings\utf_16_le.pyc 

byte-compiling C:\Python26\lib\encodings\utf_32.py to encodings\utf_32.pyc 
byte-compiling C:\Python26\lib\encodings\utf_32_be.py to encodings\utf_32_be.pyc 

byte-compiling C:\Python26\lib\encodings\utf_32_le.py to encodings\utf_32_le.pyc 

byte-compiling C:\Python26\lib\encodings\utf_7.py to encodings\utf_7.pyc 
byte-compiling C:\Python26\lib\encodings\utf_8.py to encodings\utf_8.pyc 
byte-compiling C:\Python26\lib\encodings\utf_8_sig.py to encodings\utf_8_sig.pyc 

byte-compiling C:\Python26\lib\encodings\uu_codec.py to encodings\uu_codec.pyc 
byte-compiling C:\Python26\lib\encodings\zlib_codec.py to encodings\zlib_codec.p 
yc 
byte-compiling C:\Python26\lib\functools.py to functools.pyc 
byte-compiling C:\Python26\lib\genericpath.py to genericpath.pyc 
byte-compiling C:\Python26\lib\getopt.py to getopt.pyc 
byte-compiling C:\Python26\lib\gettext.py to gettext.pyc 
byte-compiling C:\Python26\lib\heapq.py to heapq.pyc 
byte-compiling C:\Python26\lib\inspect.py to inspect.pyc 
byte-compiling C:\Python26\lib\keyword.py to keyword.pyc 
byte-compiling C:\Python26\lib\linecache.py to linecache.pyc 
byte-compiling C:\Python26\lib\locale.py to locale.pyc 
byte-compiling C:\Python26\lib\ntpath.py to ntpath.pyc 
byte-compiling C:\Python26\lib\numbers.py to numbers.pyc 
byte-compiling C:\Python26\lib\opcode.py to opcode.pyc 
byte-compiling C:\Python26\lib\optparse.py to optparse.pyc 
byte-compiling C:\Python26\lib\os.py to os.pyc 
byte-compiling C:\Python26\lib\os2emxpath.py to os2emxpath.pyc 
byte-compiling C:\Python26\lib\pdb.py to pdb.pyc 
byte-compiling C:\Python26\lib\pickle.py to pickle.pyc 
byte-compiling C:\Python26\lib\posixpath.py to posixpath.pyc 
byte-compiling C:\Python26\lib\pprint.py to pprint.pyc 
byte-compiling C:\Python26\lib\quopri.py to quopri.pyc 
byte-compiling C:\Python26\lib\random.py to random.pyc 
byte-compiling C:\Python26\lib\re.py to re.pyc 
byte-compiling C:\Python26\lib\repr.py to repr.pyc 
byte-compiling C:\Python26\lib\shlex.py to shlex.pyc 
byte-compiling C:\Python26\lib\site-packages\zipextimporter.py to zipextimporter 
.pyc 
byte-compiling C:\Python26\lib\sre.py to sre.pyc 
byte-compiling C:\Python26\lib\sre_compile.py to sre_compile.pyc 
byte-compiling C:\Python26\lib\sre_constants.py to sre_constants.pyc 
byte-compiling C:\Python26\lib\sre_parse.py to sre_parse.pyc 
byte-compiling C:\Python26\lib\stat.py to stat.pyc 
byte-compiling C:\Python26\lib\string.py to string.pyc 
byte-compiling C:\Python26\lib\stringprep.py to stringprep.pyc 
byte-compiling C:\Python26\lib\struct.py to struct.pyc 
byte-compiling C:\Python26\lib\subprocess.py to subprocess.pyc 
byte-compiling C:\Python26\lib\tempfile.py to tempfile.pyc 
byte-compiling C:\Python26\lib\textwrap.py to textwrap.pyc 
byte-compiling C:\Python26\lib\threading.py to threading.pyc 
byte-compiling C:\Python26\lib\token.py to token.pyc 
byte-compiling C:\Python26\lib\tokenize.py to tokenize.pyc 
byte-compiling C:\Python26\lib\traceback.py to traceback.pyc 
byte-compiling C:\Python26\lib\types.py to types.pyc 
byte-compiling C:\Python26\lib\unittest.py to unittest.pyc 
byte-compiling C:\Python26\lib\warnings.py to warnings.pyc 
*** copy extensions *** 
copying C:\Python26\DLLs\bz2.pyd -> C:\Python26\working\build\bdist.win32\winexe 
\collect-2.6 
copying C:\Python26\DLLs\select.pyd -> C:\Python26\working\build\bdist.win32\win 
exe\collect-2.6 
copying C:\Python26\DLLs\unicodedata.pyd -> C:\Python26\working\build\bdist.win3 
2\winexe\collect-2.6 
copying C:\Python26\lib\site-packages\cx_Oracle.pyd -> C:\Python26\working\build 
\bdist.win32\winexe\collect-2.6 
*** copy dlls *** 
copying C:\Oracle\XEClient\bin\OCI.dll -> C:\Python26\working\build\bdist.win32\ 
winexe\collect-2.6 
copying C:\Python26\lib\site-packages\py2exe\run.exe -> C:\Python26\working\dist 
\testora.exe 

*** binary dependencies *** 
Your executable(s) also depend on these dlls which are not included, 
you may or may not need to distribute them. 

Make sure you have the license if you distribute any of them, and 
make sure you don't distribute files belonging to the operating system. 

    USER32.dll - C:\WINDOWS\system32\USER32.dll 
    SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll 
    WSOCK32.dll - C:\WINDOWS\system32\WSOCK32.dll 
    ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll 
    msvcrt.dll - C:\WINDOWS\system32\msvcrt.dll 
    KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll 

C:\Python26\working\dist>testora 
Traceback (most recent call last): 
    File "testora.py", line 19, in <module> 
    File "testora.py", line 11, in testora 
cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle 

risposta

8

Hai fatto in modo di escludere OCI.dll quando hai costruito con py2exe? Se la versione della DLL sulla tua macchina non è compatibile con la versione client su un'altra macchina, la collaudi (ho notato che hai provato un client 11g ma 10g sulla tua macchina), quindi questa configurazione non funzionerà (ho dimenticato il messaggio di errore effettivo anche se).

+0

Ha funzionato! Cosi 'semplice! Grazie mille, avrei dovuto chiedermelo questo giorno fa invece di sbattere la testa contro il muro per così tanto tempo ... :) –

2

build_testora.py riveduta, per riferimento futuro:

from distutils.core import setup 
import py2exe, sys 

sys.argv.append('py2exe') 

setup(
    options = {'py2exe': { 
     'bundle_files': 2, 
     'compressed': True, 
     'dll_excludes': ["oci.dll"] 
     }}, 
    console = [{'script': "testora.py"}], 
    zipfile = None 
    ) 
+0

Funziona bene ora, sia che io usi OracleXEClient, instantclient_10_2 o instantclient_11_1. –

Problemi correlati