2016-09-09 2 views
1

Я запускаю Python 2.7 и использую cx_Oracle на 64-разрядной ОС Linux. Мне нужно иметь возможность работать против клиента 11.2 или 12.1, поскольку я не могу быть уверен, какой клиент будет установлен на развернутой цели. Я знаю, что cx_Oracle создан для каждого клиента Oracle. Как я могу быть уверен, что приложение будет работать? Я должен упомянуть, что я использую pyinstaller для упаковки приложения. Есть ли версия cx_Oracle, созданная против обоих клиентов Oracle, или мне нужно иметь две разные версии моего приложения ... один для 11g и один для клиента 12c?cx_Oracle с несколькими версиями клиента Oracle

ответ

1

Хотя теоретически вы должны быть способны создать версию cx_Oracle Oracle 11g и использовать ее как с клиентом Oracle 11g, так и с Oracle 12c, я бы не рекомендовал его. Если вы сможете убедить своих пользователей использовать мгновенный клиент Oracle 12c, который будет самым простым. Этот клиент может без проблем получить доступ к базам данных 11g и 12c. Но если это невозможно, другой вариант следующий:

1) Скомпилируйте cx_Oracle для 11g и 12c и поместите обе копии в вашу установку с именем (например) cx_Oracle_11g.so и cx_Oracle_12c.so.

2) Импорт cx_Oracle динамически с помощью кода вроде следующего:

for version in ("11g", "12c"): 
    fileName = os.path.join(installDir, "cx_Oracle_%s.so" % version) 
    try: 
     module = imp.load_dynamic("cx_Oracle", fileName) 
     break 
    except ImportError: 
     pass 

3) Используйте динамически импортированный модуль там, где вам это нужно точно так же, как и раньше. Поскольку динамически загруженный модуль был назван cx_Oracle, вы должны иметь возможность импортировать его в другой код обычным способом, и он найдет ту, которую вы динамически загрузили.

4) Используйте cx_Oracle 6.x, который одновременно поддерживает любые Oracle Client 11.2, 12.1 и 12.2.

Смежные вопросы