【问题标题】:How to bundle cx_oracle with Pyinstaller如何将 cx_oracle 与 Pyinstaller 捆绑在一起
【发布时间】:2018-05-16 04:18:43
【问题描述】:

我的目标是使用 Pyinstaller 从一个使用 Tkinter 和 cx_oracle 访问数据库的简单 python 脚本中捆绑一个 exe 文件。 python代码是在安装了Anaconda、cx_oracle包和oracle客户端的windows机器上开发的。然后我需要在许多目标 Windows 机器上运行 exe 文件没有 oracle 客户端或 Python。

我在开发机器上使用 Python 2.7 和 Pyinstaller 3.1。

我在网上搜索了很长时间,但只找到了一个关于此的教程: https://mail.python.org/pipermail/tutor/2014-December/103608.html

我按照同样的步骤修改了spec文件如下:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['mycode.py'],
             pathex=['C:\\Users\\myuser\\PycharmProjects\\mycode'],
             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 + [('oraociei11.dll','D:\ProgramFiles\Anaconda2\oraociei11.dll','BINARY')],
          a.zipfiles,
          a.datas,
          name='mycode',
          debug=False,
          strip=False,
          upx=True,
          console=True )

捆绑包工作了。代码在安装了 oracle 客户端的原始机器上运行。但是在没有 oracle 客户端的单独机器上,它无法运行,并显示以下错误消息:

Tkinter 回调异常 回溯(最近一次通话最后): 调用中的文件“lib-tk\Tkinter.py”,第 1537 行 文件“”,第 152 行,登录 DatabaseError:DPI-1047:无法加载 64 位 Oracle 客户端库:“找不到指定的模块”。请参阅https://oracle.github.io/odpi/doc/installation.html#windows 寻求帮助

现在我很困惑,将 python 脚本中的 exe 与 cx_oracle 安全捆绑,以便它可以在没有 oracle 客户端的 Windows 机器上运行,需要哪些步骤?还是我“必须”在目标机器上安装 oracle 客户端?

我真的希望找到比我上面找到的旧链接更详细的关于将 cx_oracle 与 pyinstaller 捆绑在一起的教程。

【问题讨论】:

    标签: python oracle pyinstaller cx-oracle


    【解决方案1】:

    感谢您发布此问题。你走在正确的道路上。您只是缺少其他 .dll 文件。您需要将在 Oracle 即时客户端文件夹中找到的所有 .dll 文件添加到 .spec 文件中。以下是我为即时客户端 19.10 所做的示例:

    a.binaries = a.binaries + [('oraociei19.dll','.\\instantclient_19_10\\oraociei19.dll','BINARY')]
    + [('orannzsbb19.dll','.\\instantclient_19_10\\orannzsbb19.dll','BINARY')]
    + [('oraocci19d.dll','.\\instantclient_19_10\\oraocci19d.dll','BINARY')]
    + [('oraocci19.dll','.\\instantclient_19_10\\oraocci19.dll','BINARY')]
    + [('oci.dll','.\\instantclient_19_10\\oci.dll','BINARY')]
    + [('ocijdbc19.dll','.\\instantclient_19_10\\ocijdbc19.dll','BINARY')]
    + [('ociw32.dll','.\\instantclient_19_10\\ociw32.dll','BINARY')]
    + [('oramysql19.dll','.\\instantclient_19_10\\oramysql19.dll','BINARY')]
    + [('oraons.dll','.\\instantclient_19_10\\oraons.dll','BINARY')]
    + [('orasql19.dll','.\\instantclient_19_10\\orasql19.dll','BINARY')]
    

    【讨论】:

      【解决方案2】:

      cx_Oracle 需要 Oracle 客户端。您需要在目标机器上安装它!请注意错误消息中的链接:https://oracle.github.io/odpi/doc/installation.html#windows。它应该可以帮助您完成使 cx_Oracle 在目标机器上工作所需的一切。

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2017-05-12
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 2023-03-27
        • 2019-07-24
        相关资源
        最近更新 更多