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


124

インポートしようとしてい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']

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


LD_LIBRARY_PATH正しく設定していない場合は、私の最新の回答を参照してください(コメントにコロンがないと思いました)。
Vinay Sajip、2009

1
libcurl.so.4という名前のどこかに壊れたシンボリックリンクがありますか?ファイルを見つけているのに開けないようです。他のすべてが失敗した場合は、インタープリターをトレースして、失敗した呼び出しを探します。
チャールズダフィー

回答:


158

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

その他の情報(ソース):

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

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

export LD_LIBRARY_PATH=/usr/local/lib

または

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

空の場合は最初のフォーム(空の文字列と同等か、まったく存在しない場合)を使用し、空でない場合は2番目のフォームを使用します。エクスポートの使用に注意してください。


2
ありがとう。LD_LIBRARY_PATHが設定されていなかったため、次のようにします。$ LD_LIBRARY_PATH = / usr / local / lib $ LD_LIBRARY_PATH / usr / local / libしかし、同じエラーが発生します。$ python -c "import pycurl"トレースバック(最後の最新の呼び出し):ファイル"<string>"、line 1、in <module> ImportError:libcurl.so.4:cannot open shared object file:No

2
また、LD_LIBRARY_PATH変数を設定した後で、ライブラリを読み取るためのアクセス許可をユーザーに付与する必要がありました。これでようやく動作しました。
ホセ・リカルド

56

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に対してコンパイルされていることを確認してください。別のシステムからいくつかのファイルをコピーした場合、これは常に機能するとは限りません。疑わしい場合は、実行する予定のシステムでモジュールをコンパイルします。


ありがとう-これはうまくいった。以前に試みたLD_LIBRARY_PATH変数の変更で「クイックフィックス」が行われなかったのはなぜでしょうか。

2
多くの要因に依存します。これが1つの可能性です。コードがapacheまたはcronから実行されていました。これらのプログラムは通常、環境を「一掃」するため、環境変数を取得するために追加の作業を行う必要があります。たとえば、Apacheの「SetEnv」や、cronのcrontabファイルで変数を直接設定します。ミスの可能性は無限大です!
Ch'marr 2009

24

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


4
または、python setup.py build_ext --rpath=/usr/local/lib拡張モジュールをビルド
kynan 2013

10

まったく同じ問題があった。/ opt / curl /にcurl 7.19をインストールして、本番サーバーの現在の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を実行するためだけに必要です。


sudo権限がない場合はどうなりますか?ldconfigを実行できませんか?上記のエラーをクリアする方法はありますか?
Prasanna 2013

2
@SPRajagopal:システム属性を変更する権限がない場合は、LD_LIBRARY_PATH上記の環境変数メソッドを使用する必要があります。に設定したくない場合は~/.bashrc(その設定を追加するのは良い考えではありませんIMO)、この変数を設定するシェルスクリプトを記述してpythonを実行し、そのスクリプトを呼び出すことができます。
MadScientist 2013

8

上記の回答の補足として-私は同様の問題にぶつかって、デフォルトでインストールされた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

...すぐに、より重要なエラーメッセージが表示されます-依存関係の欠如について!

私がこれをここに書き留めると思っただけです-乾杯!


それがOPのエラーの前に発生している新しいエラーではないのですか?
David Knipe 2017

1

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


1

私にとってここで機能するのは、pyenvなどのバージョンマネージャを使用することです。これは、プロジェクト環境とパッケージのバージョンを適切に管理し、システムのバージョンと分離することを強くお勧めします。

OSの更新後も同じエラーが発生しましたが、pyenv install 3.7-dev(使用するバージョン)で簡単に修正できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.