Python 2.7.2およびOracle 11gインストール用にcx_Oracleをビルドしようとしていますが、ビルドされたcx_Oracle.soはlibclntsh.so.11.1を見つけることができないため、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)
Oracleクライアントのインストールディレクトリにlibclntsh.so.11.1があります。
/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ディレクトリを選択しています:
/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
このセットアップには明らかに問題がありますか?
ありがとう
[〜#〜] update [〜#〜]
私の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:
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 [〜#〜]
この問題は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
を実行します。
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
これにより、cx_Oracleのインポート中にLD_LIBRARY_PATHを設定する必要がなくなります。
多くのOracle製品はoraenvをインストールします。他の環境変数の中で、LD_LIBRARY_PATH
ので、. oraenv
環境を手動で設定する代わりに。