【问题标题】:Pyinstaller: cx_Oracle.InterfaceError: Unable to acquire Oracle environment handlePyinstaller:cx_Oracle.InterfaceError:无法获取 Oracle 环境句柄
【发布时间】:2017-10-22 20:39:26
【问题描述】:

我有一个简单的 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 --exclude oci.dll 选项从 pyinstaller 排除 oci.dll
  • 检查我的 ORACLE_HOME 是否正确设置为: - C:\Users\nyname\AppData\Local\Continuum\Anaconda3\Lib\site-packages\instantclient_12_1

这些都没有用。

非常感谢任何我能做的其他建议。

【问题讨论】:

    标签: python pyinstaller cx-oracle


    【解决方案1】:

    我找到了解决办法:

    正常运行 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,但使用规范文件。 pyinstaller mainprogram.spec

    它会起作用的

    【讨论】:

    • 我也试过这个解决方案,但无济于事。当我在另一台机器上运行 .exe 时,仍然会出现同样的错误。您是否还需要安装 oracle 即时客户端以及默认情况下 pyinstaller 是否应将其嵌入到 .exe 中。请帮忙
    • 对我来说效果很好。您需要安装 oracle 即时客户端
    【解决方案2】:

    我使用了以下规则:

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

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

    https://github.com/pyinstaller/pyinstaller/issues/1924https://github.com/pyinstaller/pyinstaller/issues/1924的 Pyinstaller 项目的 github 上有一个未解决的问题

    希望对你有帮助

    【讨论】:

    • 是的,我打开了这个问题。还是谢谢
    【解决方案3】:

    上面描述的解决方案对我有用,只需稍作修改 - 我必须包含一个额外的 DLL:

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

    注意:我正在运行 Python 3.5 64 位、PyInstaller 3.2.1、Oracle InstantClient 12.1 64 位和 Windows 7 64 位。希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 2017-08-17
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多