импорт cx_Oracle (python) с MacOSX - PullRequest
       2

импорт cx_Oracle (python) с MacOSX

0 голосов
/ 17 ноября 2011

Ошибка импорта cx_Oracle в скрипте Python.

У меня установлен cx_Oracle с использованием "pip install cx_oracle" - он работал нормально, сообщил об установке.

Теперь, когда я попробую:

import cx_Oracle

Я получаю следующую ошибку

Traceback (most recent call last):
  File "reader.py", line 9, in <module>
    import cx_Oracle
ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Symbol not found: _OCIAttrGet
  Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so
  Expected in: flat namespace
 in /Library/Python/2.7/site-packages/cx_Oracle.so

Другая информация:

Python версия 2.7 / mac os 10.7.2 (Lion)

$ python
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin    
Type "help", "copyright", "credits" or "license" for more information.

Oracle 10.2

$ sqlplus -version    
SQL*Plus: Release 10.2.0.4.0 - Production

Кроме того, у меня нет папки / bin в моей папке ORACLE_HOME, у меня установлены только мгновенный клиент и SDK.

ox_Oracle

$ pip freeze
PyRSS2Gen==1.0.0
...
cx-Oracle==5.1.1

(нашел много вопросов по установке cx_Oracle, но ни одного по этому вопросу - спасибо)

Ответы [ 2 ]

2 голосов
/ 10 декабря 2015

Я столкнулся с этой проблемой сегодня и смог ее решить, изменив путь к библиотекам, на которые есть ссылки в двоичных файлах InstantClient, на фактические места в файловой системе. Этот блог http://blog.caseylucas.com/2013/03/03/oracle-sqlplus-and-instant-client-on-mac-osx-without-dyld_library_path/ содержит подробное объяснение и скрипт для настройки всех двоичных файлов. Единственная проблема заключается в том, что он использует @executable_path, который, похоже, больше не работает с Python 2.7 и El Capitan (я не совсем уверен, что отвечает за исключение безопасности). Замена @executable_path на фактический путь работает просто отлично.

Подводя итог, шаги, чтобы заставить его работать:

  • установить InstantClient в / usr / local / instantclient_11_2
  • убедитесь, что используемый вами общий объект cx_Oracle.so находится по адресу /Library/Python/2.7/site-packages/cx_Oracle.so
  • скопируйте следующий скрипт в / usr / local / instantclient_11_2

    #!/bin/sh
    # script to change the dynamic lib paths and ids for oracle instant client
    # exes and libs
    (echo /Library/Python/2.7/site-packages/cx_Oracle.so ; find . -maxdepth 1 -type f \( -perm -1 -o \( -perm -10 -o -perm -100 \) \) -print ) | while read exe
    do
        echo adjusting executable $exe
        baseexe=`basename $exe`
        otool -L $exe | awk '/oracle/ {print $1}' | while read lib
        do
            echo adjusting lib $lib
            baselib=`basename $lib`
            if [ "$baseexe" = "$baselib" ]
            then
                echo changing id to $baselib for $exe
                install_name_tool -id $baselib $exe
            else
                echo changing path id for $lib in $exe
                install_name_tool -change $lib /usr/local/instantclient_11_2/$baselib $exe
            fi
        done
    done
    
    • запустить скрипт с правами root.
0 голосов
/ 29 декабря 2011

Удалить все.

Затем установите мгновенный клиент oracle:

Затем используйте pip для установки cx_oracle.

Затем установите путь, чтобы указать 32-битную версию Oracle.

  • отредактируйте файл .profile в своей домашней директории и добавьте путь к домашней папке oracle bin, используя следующую строку:
  • export PATH = $ PATH: / usr / local / lib / instantclient /

И это работает ...

...