【问题标题】:Deploying cx_Oracle onto various versions of Oracle Client将 cx_Oracle 部署到各种版本的 Oracle 客户端
【发布时间】:2011-03-21 21:42:47
【问题描述】:

我有一些使用 cx_Oracle 连接到 Oracle 数据库的小型 Python 应用程序。我通过使用 py2exe 编译这些应用程序来部署它们,这在许多情况下都可以正常工作。

问题是,对于需要安装它的许多人来说,没有标准的 Oracle 客户端版本(例如 9i 和 10g),试图让每个人都在一个单一的 Oracle 客户端版本上标准化会非常令人沮丧.我目前正在使用 9.2 客户端和 cx_Oracle 4.4.1 for 9i,所以当我 py2exe 生成的 exe 包含 cx_Oracle 4.4.1 库并且不适用于 10g 客户端。

我不使用任何 Oracle 版本的任何特定功能,因此我真的没有理由关心正在使用的客户端版本,除了 cx_Oracle 兼容性问题。

理想的解决方案是以某种方式编译一个完全独立于机器上安装的 Oracle 客户端的版本。

如果这不可能,我愿意为每个主要的 Oracle 版本(my_app_9i.exe、my_app_10g.exe 等)编译单独的 exe,但我什至想不出一个简单的方法来做到这一点,因为安装了一个新的cx_Oracle 覆盖了我的旧版本,每当我进行更改时,我都必须不断地来回交换库以编译其他版本。

欢迎任何建议或其他选择。

【问题讨论】:

    标签: python oracle py2exe cx-oracle instantclient


    【解决方案1】:

    如果您想构建多个 cx_Oracle 版本(例如:cx_Oracle10g、cx_Oracle11g 等),那么您需要修改 cx_Oracle setup.py 脚本。脚本的最后一步是调用setup();第一个参数是要构建的模块的名称。您需要做的就是将"cx_Oracle" 更改为"cx_Oracle" + ver,其中ver 为10g11g 等。创建多个脚本并对其进行硬编码,或者向setup.py 添加另一个参数以选择它动态的。

    当然,一旦你有了这个,你就需要一种机制来在运行时加载正确的模块。为此,您需要创建自己的 cx_Oracle 模块,该模块的 __init__.py 文件如下所示:

    try:
      from cx_Oracle9g import *
    except ImportError:
      try:
        from cx_Oracle10g import *
      except ImportError:
        try:
          from cx_Oracle11g import *
    

    您需要做的就是将您的自定义 cx_Oracle 模块以及正确的 cx_OracleXg 模块与您的应用程序一起发布。

    或者,您可以让您的自定义 cx_Oracle 模块动态检查每个可用的 Oracle 客户端库(9g、10g、11g 等),然后只导入正确匹配的 cx_OracleXg 模块。在这种情况下,您只需发送一个二进制文件,其中包含您的自定义 cx_Oracle 模块以及所有 cx_OracleXg 模块。

    【讨论】:

    • 感谢您提供优雅且面向未来的解决方案,很抱歉我花了这么长时间才接受它。
    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2018-09-10
    • 1970-01-01
    • 2020-03-18
    • 2012-01-16
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多