2009-07-20 63 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

相關問題