2010-08-19 4 views
22

Как я могу получить доступ к Oracle из Python? Я загрузил установщик cx_Oracle msi, но Python не может импортировать библиотеку.Как я могу получить доступ к Oracle из Python?

я получаю следующее сообщение об ошибке:

import cx_Oracle 

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    import cx_Oracle 
ImportError: DLL load failed: The specified module could not be found. 

я буду благодарен за любую помощь.

+4

Какой cx_Oracle вы хотите скачать? [Есть много] (http://cx-oracle.sourceforge.net/). Кроме того, какую версию Python, какую версию Oracle и какую операционную систему вы используете? –

+0

cx_Oracle-5.0.2-10g.win32-py26 – user425194

+1

Похоже, что он не может быть извлечен из PATH, который использует python для поиска модулей. Вы пытались установить его с помощью easy_install, а не явно (это может быть отсутствие другой зависимости). – JulesLt

ответ

2

В дополнение к cx_Oracle вам необходимо установить клиентскую библиотеку Oracle и установить правильные пути для того, чтобы cx_Oracle нашел ее - попробуйте открыть библиотеку cx_Oracle в «Dependency Walker» (http://www.dependencywalker.com/), чтобы узнать, что недостающая DLL является.

28

Вот что сработало для меня. Мои версии Python и Oracle немного отличаются от ваших, но должен применяться тот же подход. Просто убедитесь, что версия cx_Oracle для двоичной установки совпадает с версией клиента Oracle и Python.

Мои версии:

  • Python 2.7
  • Oracle Instant Client 11G R2
  • cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
  • Windows XP SP3

Этапы:

  1. Загрузите пакет Oracle Instant Client. Я использовал instantclient-basic-win32-11.2.0.1.0.zip. Распакуйте его до C: \ your \ path \ to \ instantclient_11_2
  2. Загрузите и выполните двоичный установщик cx_Oracle. Я использовал cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Я установил его для всех пользователей и указал на место Python 2.7, найденное в реестре.
  3. Задайте переменные среды ORACLE_HOME и PATH с помощью пакетного скрипта или любого другого механизма, который имеет смысл в контексте вашего приложения, чтобы они указывали на каталог Oracle Instant Client. См. Источник oracle_python.bat ниже. Я уверен, что для этого должно быть более элегантное решение, но я хотел как можно больше ограничить свои общесистемные изменения. Убедитесь, что вы разместили целевой каталог Oracle Instant Client в начале PATH (или, по крайней мере, опережаете любые другие клиентские каталоги Oracle). Прямо сейчас, я занимаюсь только командами, поэтому я запускаю oracle_python.bat в оболочке перед запуском любых программ, для которых требуется cx_Oracle.
  4. Запустите regedit и проверьте, есть ли ключ NLS_LANG в \ HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE. Если это так, переименуйте ключ (я изменил его на NLS_LANG_OLD) или отменил его. Этот ключ следует использовать только как значение NLS_LANG по умолчанию для клиента Oracle 7, поэтому его можно удалить, если вы не используете клиент Oracle 7 где-то еще. Как всегда, перед внесением изменений обязательно создайте резервную копию своего реестра.
  5. Теперь вы должны иметь возможность импортировать cx_Oracle в свою программу Python. См. Источник oracle_test.py ниже. Обратите внимание, что мне пришлось установить соединение и строки SQL в Unicode для моей версии cx_Oracle.

Источник: oracle_python.bat

@echo off 
set ORACLE_HOME=C:\your\path\to\instantclient_11_2 
set PATH=%ORACLE_HOME%;%PATH% 

Источник: oracle_test.ру

import cx_Oracle 

conn_str = u'user/[email protected]:port/service' 
conn = cx_Oracle.connect(conn_str) 
c = conn.cursor() 
c.execute(u'select your_col_1, your_col_2 from your_table') 
for row in c: 
    print row[0], "-", row[1] 
conn.close() 

Возможные проблемы:

  • "ORA-12705: Не удается получить доступ к файлам данных NLS или недействительный среды, указанный" - я столкнулся с этим, прежде чем я сделал изменения реестра NLS_LANG.
  • «ТипError: аргумент 1 должен быть unicode, а не str» - если вам нужно установить строку подключения в Unicode.
  • «TypeError: ожидать None или string» - если вам нужно установить строку SQL в Unicode.
  • «ImportError: Ошибка загрузки DLL: указанная процедура не найдена». - может указывать на то, что cx_Oracle не может найти соответствующую DLL-клиент Oracle.
+0

Кто-нибудь знает, работает ли это с другими версиями (например, 3.4 и 64 бит), если все номера версий и платформы выровнены? –

+1

@TheRedPea Это работало для меня для версий 3.5 и 64 бит. – Abdul

+0

Я все еще борюсь с ошибкой 'ImportError: DLL load: указанная процедура не найдена. ', Пока я пытаюсь импортировать библиотеку cx_Oracle. – Akshay

3

В дополнение к мгновенному клиенту Oracle вам также может потребоваться установить компоненты Oracle ODAC и поместить путь к ним в ваш системный путь. Кажется, что cx_Oracle нуждается в доступе к файлу oci.dll, который установлен с ними.

Также проверьте, что вы получаете правильную версию (32 бит или 64 бит) из них, которая соответствует вашим: версиям python, cx_Oracle и мгновенного клиента.

1

Обеспечить эти два, и она должна работать: -

  1. Python, Oracle instantclient и cx_Oracle являются 32 бит.
  2. Установите переменные среды.

Устраняет эту проблему в окнах, как очарование.

+0

, который не был преднамеренным, не уверен, как это произошло. –

2

Если вы используете virtualenv, то не так тривиально получить драйвер, используя установщик. Что вы можете сделать тогда: установите его, как описано Devon. Затем скопируйте cx_Oracle.pyd и папку cx_Oracle-XXX.egg-info из пакетов Python \ Lib \ site-packages в пакеты Lib \ site-packages из вашего виртуального env. Конечно, здесь также важны архитектура и версия.

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