2

我有一些使用 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 会覆盖我的旧版本,每当我进行更改时,我都必须不断地来回交换库以编译其他版本。

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

4

1 回答 1

3

如果要构建多个 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模块。

于 2010-09-01T22:01:02.910 回答