代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Kemp

从py2exe程序连接到Oracle时出错:无法获取Oracle环境句柄

  •  6
  • Jeffrey Kemp  · 技术社区  · 16 年前

    我的python程序(Python2.6)在使用python解释器运行时运行良好,它连接到Oracle数据库(10g XE),没有错误。但是,当我使用py2exe编译它时,可执行版本会失败,在调用cx_Oracle.connect()时出现“无法获取Oracle环境句柄”。

    我尝试了以下方法,但毫无乐趣:

    • Oracle即时客户端10g和11g
    • Oracle XE客户端
    • 重新安装cx_Oracle-5.0.2-10g.win32-py2.6.msi
    • 背景 ORACLE_HOME 以及路径
    • 另一台只有Oracle客户端和exe的计算机
    • 用于构建exe的各种选项(无压缩和/或使用zip文件)

    testora.py:

    import cx_Oracle
    import decimal # needed for py2exe to compile this correctly
    
    def testora():
        """testora
    
        >>> testora.testora()
        <cx_Oracle.Connection to scott@localhost:1521/orcl>
        X
        """
        orcl = cx_Oracle.connect('scott/tiger@localhost: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 scott@localhost: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
    
    2 回复  |  直到 16 年前
        1
  •  8
  •   Mark Roddy    16 年前

    在使用py2exe构建时,是否确保排除OCI.dll?如果您机器上的DLL版本与您测试它的另一台机器上的客户端版本不兼容(我注意到您尝试了11g客户端,但在您的机器上尝试了10g客户端),那么此配置将无法工作(尽管我忘记了实际的错误消息)。

        2
  •  2
  •   Jeffrey Kemp    16 年前

    修订的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
        )