Pyinstaller:cx_Oracle.InterfaceError:无法获取Oracle环境句柄

时间:2016-04-07 14:12:34

标签: python pyinstaller cx-oracle

我有一个简单的python脚本,它导入cx_Oracle,然后进行sql查询。从python运行时一切正常。我在我的计算机上安装了Oracle SQL开发人员,这是免费的。

然后当我用' pyinstaller main.py'编译程序时一切都编好了,我也可以解决问题。但是,只要从该程序进行SQL查询,就会发生以下运行时错误:

cx_Oracle.InterfaceError:无法获取Oracle环境句柄

我尝试了以下内容:

  • 将所有.dll和.jar文件从oracle移动到构建目录,如下所示:https://sourceforge.net/p/cx-oracle/mailman/cx-oracle-users/thread/g7nbks $ tl $ 1@ger.gmane.org /
  • 使用pyinstaller main.py排除oci.dll - 从pyinstaller中排除oci.dll选项
  • 检查我的ORACLE_HOME是否设置正确: - C:\ Users \ nyname \ AppData \ Local \ Continuum \ Anaconda3 \ Lib \ site-packages \ instantclient_12_1

这些都没有奏效。

任何建议我还能做些什么都非常感激。

3 个答案:

答案 0 :(得分:4)

我找到了解决方案:

正常运行pyinstaller时,编译中将缺少一个文件。它需要手动包括:

为此您需要按如下方式编辑该行:

binaries+[('oraociei12.dll','oraociei12.dll','BINARY')],

确保oraociei12.dll在当前文件夹中。

block_cipher = None
    a = Analysis(['LDM-shark.py'],
                 pathex=['C:\\Users\\dicknic\\AppData\\Local\\Home\\dev\\LDM'],
                 binaries=None,
                 datas=None,
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries+[('oraociei12.dll','oraociei12.dll','BINARY')],
              a.zipfiles,
              a.datas,
              name='mainprogram',
              debug=False,
              strip=False,
              upx=True,
              console=True )

在第二步中再次运行pyinstaller但使用spec文件。 pyinstaller mainprogram.spec

它会起作用

答案 1 :(得分:2)

我使用了以下规则:

a.binaries+[('oraociei12.dll','C:\\oracle\\product\\instantclient_12_1\\oraociei12.dll','BINARY')],

元组的第二个元素是DLL的完整路径。最好知道这个......

github上的https://github.com/pyinstaller/pyinstaller/issues/1924

上的Pyinstaller项目存在一个未解决的问题

我希望这可以帮助

答案 2 :(得分:1)

The solution described above worked for me, with one small modification - I had to include an extra DLL:

a.binaries+[('oraociei12.dll','C:\\instantclient_12_1\\oraociei12.dll','BINARY'), ('oraons.dll','C:\\instantclient_12_1\\oraons.dll','BINARY')]

Note: I am running Python 3.5 64-bit, PyInstaller 3.2.1, Oracle InstantClient 12.1 64-bit, and Windows 7 64-bit. Hope this helps someone.