سؤال

أحاول إنشاء cx_Oracle لتثبيت Python 2.7.2 وOracle 11g لكن cx_Oracle.so المدمج لا يمكنه العثور على libclntsh.so.11.1 لذا يفشل استيراد cx_Oracle في Python.

/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)

أملك libclntsh.so.11.1 في دليل تثبيت عميل 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

ويقوم cx_Oracle setup.py باختيار lib dir هذا:

/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

هل من الواضح أن هناك خطأ ما في هذا الإعداد؟

شكرًا

تحديث

لي LD_LIBRARY_PATH يحتوي على دليل lib أعلاه مع libclntsh.so.11.1

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

لا يبدو أن هذا يحدث أي فرق.أقوم بإعادة إنشاء ملف cx_Oracle.so ولا يزال يظهر libclntsh.so.11.1 => not found عندما أركض $ ldd cx_Oracle.so.

فشل بايثون في تحميل الوحدة المضمنة:

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

تم حلها

وكانت القضية تتعلق LD_LIBRARY_PATH متغيرات البيئة.نظرًا للقيود المفروضة على الإعداد الذي أعمل معه (corp env)، اضطررت إلى إنشاء cx_Oracle كمستخدم آخر (حساب النظام).أي.كنت أقوم بتشغيل هذا:

$ sudo -u username python27 setup.py build

لذا بالرغم من LD_LIBRARY_PATH تم تعيينه بشكل صحيح بالنسبة لي، ولم يتم استخدام الإصدار الخاص بي عند تنفيذ الأمر كمستخدم مختلف.لقد تمكنت من الإنشاء بنجاح عن طريق نقل الكود المصدري إلى موقع كان لدي فيه أذونات وتشغيل الإنشاء كمستخدم خاص بي.

هل كانت مفيدة؟

المحلول

يضيف /apps/oracle/client/11.2.0.1/home1/lib/ لك LD_LIBRARY_PATH متغير البيئة تنفيذ الأمر أدناه في المحطة قبل تشغيل Python أو إضافته إلى .bashrc

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

نصائح أخرى

نعم.لقد نسيت إخبار أداة التحميل المؤقتة الخاصة بك بأنها بحاجة إلى البحث في هذا الدليل عن المكتبات.أضف هذا الدليل إلى /etc/ld.so.conf أو ملف مماثل وتشغيل ldconfig.

تقوم العديد من منتجات Oracle بتثبيت oraenv.سيتم تعيينه، من بين متغيرات البيئة الأخرى، LD_LIBRARY_PATH, ، لذا فكر في الجري . oraenv بدلاً من ضبط بيئتك يدويًا.

تعيين LD_RUN_PATH.(يتم استخدام LD_RUN_PATH بواسطة الرابط لتحديد مكان البحث عن المكتبات في وقت التشغيل فقط.)

الآن قم ببناء 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

لن يتطلب هذا إعداد LD_LIBRARY_PATH أثناء استيراد cx_Oracle.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top