2009-07-20 89 views
6

当我使用Python解释器运行python程序(Python 2.6)时,它正常工作,它连接到Oracle数据库(10g XE)而没有错误。但是,当我使用py2exe进行编译时,可执行版本在调用cx_Oracle.connect()时出现“Unable to acquire Oracle environment handle”失败。从py2exe'd程序连接到Oracle时出错:无法获取Oracle环境句柄

我已经试过没有快乐如下:

  • Oracle即时客户端10g和11g
  • 的Oracle XE客户端
  • 重新安装cx_Oracle-5.0.2-10g.win32-py2.6。微星
  • 设置ORACLE_HOME以及PATH
  • 另一台计算机上只是一个Oracle客户端和EXE
  • 为buildi各种选项纳克的exe(无压缩和/或使用的压缩文件)

我的测试用例:

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 
    ) 

结果:

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 

回答

8

当您使用py2exe构建时,您是否确保排除OCI.dll?如果你的机器上的DLL版本与你测试的其他机器上的客户机版本不兼容(我注意到你尝试了11g客户机,但是在你的机器上尝试了10g),那么这个配置将不起作用(我忘记了实际的错误信息虽然)。

+0

它的工作!很简单!感谢堆,我应该问这个天前,而不是把我的头撞在墙上这么久...... :) – 2009-07-20 03:19:21

2

修订build_testora.py,以供将来参考:

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

现在工作正常,无论我使用OracleXEClient,instantclient_10_2还是instantclient_11_1。 – 2009-07-20 03:27:06