2012-07-25 10 views
27

Próbuję zbudować cx_Oracle dla instalacji Pythona 2.7.2 i Oracle 11g, ale zbudowany cx_Oracle.so nie może znaleźć libclntsh.so.11.1, więc importowanie cx_Oracle w Python kończy się niepowodzeniem.Problem budowy cx_Oracle - libclntsh.so.11.1 => nie znaleziono

/mypath/cx_Oracle-5.1.1/build/lib.linux-x86_64-2.7-11g]$ ldd cx_Oracle.so 
    libclntsh.so.11.1 => not found 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ae9be290000) 
    libc.so.6 => /lib64/libc.so.6 (0x00002ae9be4ab000) 
    /lib64/ld-linux-x86-64.so.2 (0x000000389b600000) 

mam libclntsh.so.11.1 w moim katalogu instalacyjnego klienta Oracle:

/apps/oracle/client/11.2.0.1/home1/lib]$ ls -l libclntsh.so* 
libclntsh.so -> /apps/oracle/client/11.2.0.1/home1/lib/libclntsh.so.11.1 
libclntsh.so.11.1 

A setup.py cx_Oracle jest wybranie tej lib dir up:

/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build 
/apps/oracle/client/11.2.0.1/home1/ 
running build 
running build_ext 
building 'cx_Oracle' extension 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/apps/oracle/client/11.2.0.1/home1/rdbms/demo -I/apps/oracle/client/11.2.0.1/home1/rdbms/public -I/apps/bweb/python-2.7.2/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -DBUILD_VERSION=5.1.1 
In file included from /apps/oracle/client/11.2.0.1/home1/rdbms/public/oci.h:3024, 
       from cx_Oracle.c:10: 
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10788: warning: function declaration isn't a prototype 
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10794: warning: function declaration isn't a prototype 
gcc -pthread -shared build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -L/apps/oracle/client/11.2.0.1/home1/lib -lclntsh -o build/lib.linux-x86_64-2.7-11g/cx_Oracle.so 

Czy coś jest nie tak z tą konfiguracją?

Dzięki

UPDATE

Moja LD_LIBRARY_PATH zawiera katalog lib powyżej libclntsh.so.11.1

$ echo $LD_LIBRARY_PATH 
/apps/oracle/client/11.2.0.1/lib 

To nie wydaje się żadnej różnicy. Przebudowuję plik cx_Oracle.so i nadal wyświetla się libclntsh.so.11.1 => not found po uruchomieniu $ ldd cx_Oracle.so.

Python braku załadować wbudowanego modułu:

Python 2.7.2 (default, Jan 19 2012, 14:38:32) 
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import cx_Oracle 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory 

SOLVED

Problem był związany do zmiennej środowiskowej LD_LIBRARY_PATH. Z powodu ograniczeń dotyczących konfiguracji, z którą pracuję (corp env), musiałem zbudować cx_Oracle jako inny użytkownik (konto systemowe). tj biegałam to:

$ sudo -u username python27 setup.py build 

Więc chociaż LD_LIBRARY_PATH został ustawiony prawidłowo dla mnie, moja wersja nie została wykorzystana, gdy polecenie zostało wykonane jako inny użytkownik. Udało mi się zbudować pomyślnie, przenosząc kod źródłowy do lokalizacji, w której mam uprawnienia i uruchamiając kompilację jako mój użytkownik.

Odpowiedz

26

/apps/oracle/client/11.2.0.1/home1/lib/ Dodaj do LD_LIBRARY_PATH zmiennej środowiskowej wykonać polecenie poniżej w terminalu przed systemem pytona lub dodać go do wielu produktów firmy .bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/ 
+0

z jakiego systemu operacyjnego używasz? Niektóre dystrybucje systemu UNIX używają 'LD_LIB_PATH' zamiast' LD_LIBRARY_PATH'? Możesz także sprawdzić uprawnienia do pliku i upewnić się, że jest on czytelny dla twojego skryptu. – Meitham

+1

RHEL 6. Myślę, że LD_LIBRARY_PATH jest poprawne, ale wygląda na to, że nie jest brane pod uwagę, gdy z jakiegoś powodu dzieje się cx_Oracle. – Alex

+0

Dzięki. Próbowałem tego i nie wydaje się, aby rozwiązać. Ustawiłem LD_LIBRARY_PATH i ponownie zbudowałem cx_Oracle.so. Nadal pokazuje libclntsh.so.11.1 => nie znaleziono. Potwierdzono, że jest ustawiony w interpretera Pythona i nie mogę załadować cx_Oracle z powodu powyższego problemu. Problem jest w momencie budowania cx_Oracle, prawda? 'os.environ [ 'LD_LIBRARY_PATH']' ' '/ apps/oracle/klient/11.2.0.1/lib' ' >>> import cx_Oracle Traceback (najnowsza wezwanie ostatni): File "", wiersz 1 , w ' ' ImportError: libclntsh.so.11.1: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu ' – Alex

1

Tak. Zapomniałeś powiedzieć narzędziu pamięci podręcznej programu ładującego, że musi szukać w tym katalogu bibliotek. Dodaj ten katalog do /etc/ld.so.conf lub podobnego pliku i uruchom ldconfig.

+0

Dzięki. Już ustawiłem ** LD_LIBRARY_PATH **, aby uwzględnić ten katalog lib - czy to samo by się stało? Nie mogę edytować pliku /etc/ld.so.conf lub podobnego, ponieważ nie mam uprawnień. – Alex

+0

Na razie, ale ty * naprawdę * powinieneś porozmawiać z sysadminem. –

+1

W Fedorze 20, LD_LIBRARY_PATH nie obciążyło mnie, ale /etc/ld.so.conf.d/ pracował: echo /usr/lib/oracle/12.1/client64/lib> /etc/ld.so.conf .d/oracle.conf; ldconfig –

0

oracle zainstalować oraenv. Ustawi on, między innymi zmiennymi środowiskowymi, LD_LIBRARY_PATH, więc pomyśl o uruchomieniu . oraenv zamiast ręcznego ustawiania środowiska.

0

Ustawienie LD_RUN_PATH.(LD_RUN_PATH jest używane przez linker do określenia, gdzie szukać bibliotek tylko w czasie wykonywania).

Teraz zbuduj cx_Oracle.

/mypath/cx_Oracle-5.1.1]$ export LD_RUN_PATH="/apps/oracle/client/11.2.0.1/home1/lib" 
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build 

Nie będzie wymagać ustawienia LD_LIBRARY_PATH podczas importowania cx_Oracle.

Powiązane problemy