Развертывание cx_Oracle на различных версиях Oracle Client - PullRequest
2 голосов
/ 28 июля 2010

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

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

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

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

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

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

1 Ответ

3 голосов
/ 02 сентября 2010

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

...