web-dev-qa-db-ja.com

sys.pathのディレクトリにある共有オブジェクトをPythonで見つけられないのはなぜですか?

私はpycurlをインポートしようとしています:

$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory

現在、libcurl.so.4は/ usr/local/libにあります。ご覧のとおり、これはsys.pathにあります。

$ python -c "import sys; print sys.path"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.Egg', 
'/usr/local/lib/python25.Zip', '/usr/local/lib/python2.5', 
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk', 
'/usr/local/lib/python2.5/lib-dynload', 
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib', 
'/usr/local/lib/python2.5/site-packages']

どんな助けも大歓迎です。

113
user135171

sys.pathは、Pythonモジュールに対してのみ検索されます。ダイナミックリンクライブラリの場合、検索されるパスはLD_LIBRARY_PATHにある必要があります。 LD_LIBRARY_PATH/usr/local/libが含まれているかどうかを確認し、含まれていない場合は追加してから再試行してください。

詳細情報( source ):

Linuxでは、環境変数LD_LIBRARY_PATHはコロンで区切られたディレクトリのセットであり、最初にライブラリの標準セットの前にライブラリを検索する必要があります。これは、新しいライブラリをデバッグするとき、または特殊な目的で非標準ライブラリを使用するときに便利です。環境変数LD_PRELOADは、/ etc/ld.so.preloadが行うように、標準セットをオーバーライドする機能を持つ共有ライブラリをリストします。これらは、ローダー/lib/ld-linux.soによって実装されます。 LD_LIBRARY_PATHは多くのUnixライクなシステムで動作しますが、すべてでは動作しないことに注意してください。たとえば、この機能はHP-UXで使用できますが、環境変数SHLIB_PATHとして使用できます。AIXでは、この機能は変数LIBPATHを使用します(同じ構文、コロンで区切られたリスト)。

Update:LD_LIBRARY_PATHを設定するには、理想的には~/.bashrcまたは同等のファイルで、次のいずれかを使用します。

export LD_LIBRARY_PATH=/usr/local/lib

または

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

最初のフォームが空の場合(空の文字列に相当するか、まったく存在しない場合)を使用し、空の場合は2番目のフォームを使用します。 exportの使用に注意してください。

149
Vinay Sajip

Libcurl.soモジュールがpythonライブラリパスとは異なるシステムライブラリパスにあることを確認してください。

「簡単な修正」は、このパスをLD_LIBRARY_PATH変数に追加することです。ただし、システム全体(またはアカウント全体)を設定することは悪い考えです。プログラムによってはライブラリが見つからないように設定できるため、さらに悪いことにセキュリティホールが開かれる可能性があるためです。

「ローカルにインストールされたライブラリ」が/ usr/local/libなどにインストールされている場合、このディレクトリを/etc/ld.so.conf(テキストファイル)に追加し、「ldconfig」を実行します。

このコマンドはキャッシングユーティリティを実行しますが、ローダーシステムが機能するために必要なすべての必要な「シンボリックリンク」も作成します。 libcurlの「make install」がこれをまだ行っていないのは驚くべきことですが、/ usr/local/libが/etc/ld.so.confにない場合はできません。

PS:/etc/ld.so.confに「include ld.so.conf.d/*。conf」しか含まれていない可能性があります。それでもディレクトリパスを追加することも、インクルードされるディレクトリ内に新しいファイルを作成することもできます。その後に「ldconfig」を実行することを忘れないでください。

注意してください。これを間違えると、システムが台無しになる可能性があります。

さらに:pythonモジュールがlibcurlのそのバージョンに対してコンパイルされていることを確認してください。別のシステムからいくつかのファイルをコピーしただけの場合、これは常に機能しません。疑わしい場合は、実行するシステムでモジュールをコンパイルします。

55
Ch'marr

Pycurlを最初にコンパイルするときに、ユーザー環境でLD_RUN_PATHを/ usr/local/libに設定することもできます。これにより、C拡張モジュール.soのRPATH属性に/ usr/local/libが埋め込まれるため、実行時にLD_LIBRARY_PATHを設定しなくても、実行時にライブラリがどこにあるかが自動的にわかります。

24

まったく同じ問題がありました。 curl 7.19を/ opt/curl /にインストールして、運用サーバーの現在のcurlに影響を与えないようにしました。 libcurl.so.4を/ usr/libにリンクしたら:

Sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4

それでも同じエラーが発生しました!ダーフ。

しかし、ldconfigを実行するとリンケージが作成され、機能しました。 LD_RUN_PATHまたはLD_LIBRARY_PATHを設定する必要はまったくありません。 ldconfigを実行するために必要です。

10
Matt

上記の答えの補足として-私は同様の問題にぶつかり、デフォルトでインストールされたPythonで完全に動作しています。

LD_LIBRARY_PATHで探している共有オブジェクトライブラリの例を呼び出すと、次のようになります。

$ LD_LIBRARY_PATH=/path/to/mysodir:$LD_LIBRARY_PATH python example-so-user.py
python: can't open file 'example-so-user.py': [Errno 2] No such file or directory

特に、インポートについても文句を言わない-ソースファイルについて文句を言う!

しかし、LD_PRELOADを使用してオブジェクトのロードを強制する場合:

$ LD_PRELOAD=/path/to/mysodir/mypyobj.so python example-so-user.py
python: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory

...すぐに、より意味のあるエラーメッセージが表示されます-依存関係の欠落についてです!

私はここでこれを書き留めると思いました-乾杯!

8
sdaau

python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0を使用し、コンパイルされた.soファイルはbuildフォルダーの下にあります。 python setup.py --help build_extと入力して、-Rおよび-Iの説明を表示できます。

0
ScutterKey