Развертывание cx_Oracle на различные версии Oracle Client

У меня есть небольшие приложения для python, которые используют cx_Oracle для подключения к базе данных Oracle. Я развертываю эти приложения, компилируя их с помощью py2exe, который отлично работает во многих случаях.

Проблема в том, что нет стандартной версии Oracle Client (например, 9i и 10g) у многих людей, которым необходимо установить это, и было бы очень сложно попытаться заставить всех стандартизоваться на одной версии Oracle Client. Я использую клиента 9.2 с cx_Oracle 4.4.1 для 9i на данный момент, и поэтому, когда я пию exex, итоговый exe включает библиотеку cx_Oracle 4.4.1 и не будет работать с 10g клиентами.

Я не использую каких-либо специфических особенностей любой из версий Oracle, поэтому у меня нет причин заботиться о том, какая версия клиента используется, за исключением проблем с совместимостью cx_Oracle.

Идеальным решением было бы как-то скомпилировать версию, полностью независимую от клиента Oracle, установленного на машине.

Если это невозможно, я бы хотел скомпилировать отдельные exes для каждой основной версии Oracle (my_app_9i.exe, my_app_10g.exe и т. Д.), Но я не могу найти простой способ сделать это, поскольку установка нового cx_Oracle перезаписывает мои старой версии, мне пришлось бы поменять местами библиотеку назад и вперед, чтобы скомпилировать другие версии всякий раз, когда я делаю изменения.

Любые советы или другие варианты приветствуются.

Если вы хотите создать несколько версий cx_Oracle (например: cx_Oracle10g, cx_Oracle11g и т. Д.), Вам нужно будет изменить скрипт cx_Oracle setup.py. Последним шагом в скрипте является вызов setup() ; первым параметром является имя модуля для сборки. Все, что вам нужно сделать, это изменить "cx_Oracle" на "cx_Oracle" + ver , где ver – 10g , 11g и т. Д. Либо создайте несколько скриптов, либо "cx_Oracle" + ver их, либо добавьте еще один параметр в 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 .