Python実行可能ファイルがlibpython共有ライブラリを見つけられない


143

CentOS 5にPython 2.7をインストールしています。Pythonを次のようにビルドしてインストールしました

./configure --enable-shared --prefix=/usr/local
make
make install

/ usr / local / bin / pythonを実行しようとすると、このエラーメッセージが表示されます

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

/ usr / local / bin / pythonでlddを実行すると、

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)

libpythonの場所をPythonにどのように通知しますか?

回答:


203

以下を試してください:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

にない場合/usr/local/libは、インストールしたフォルダに置き換えます。libpython2.7.so.1.0/usr/local/lib

これが機能し、変更を永続的にしたい場合は、2つのオプションがあります。

  1. をホームディレクトリに追加export LD_LIBRARY_PATH=/usr/local/libします.profile(これは、新しいシェルインスタンスの起動時にこのファイルをロードするシェルを使用している場合にのみ機能します)。この設定はユーザーにのみ影響します。

  2. に追加/usr/local/lib/etc/ld.so.confて実行しldconfigます。もちろん、これはシステム全体の設定です。


Eclipseで動作するようにエクスポートする方法はありますか?.profileに追加しましたが、Eclipseはgdbを起動できません。(注:ld.so.confへの追加は機能します)
Setheron 2012

だから私はEclipseが実行されている環境変数をチェックしました、そしてそれは適切なLD_LIBRARY_PATHを持っています GDBを起動するときにシェルを使用しないため、環境変数を取得しないと思います。デバッグ構成でlibpythonを設定しても、gdbが実際にロードされたとき(ただし、gdb自体をロードするにはlibが必要です)のため、どちらも役に立ちませんでした
Setheron

1
gdbコマンドラインから実行し、ターミナルでLD_LIBRARY_PATHが正しく設定されている場合、アプリケーションを正常にデバッグできますか?そうでない場合は、おそらく.gdbinitファイルにLD_LIBRARY_PATHを設定する必要があります。詳細については、この回答を参照してください
。stackoverflow.com

アプリケーションの実際のデバッグではなく、起動gdb(python libs)にLD_LIBRARY_PATHが必要です。これまでのところ、ldconfigで設定することで解決できました。ただし、ZSHRCファイルからLD_LIBRARY_PATHを取得するため、CLIを介してアプリケーションをデバッグできます。
Setheron 2012

10
これを試している人へのメモ:これは単なる「/ usr / local / lib」であり、元の「include ld.so.conf.d / *。conf」のような「include」の開始ではありません。
timss

79

墓掘りの帽子をかぶって…

これに対処するために私が見つけた最良の方法は、コンパイル時です。あなたが唯一の設定接頭辞なので、いずれにしても、共有ライブラリの場所を実行可能ファイルに明示的に伝えることもできます。OpenSSLや他のソフトウェアパッケージとは異なり、Pythonは代替ライブラリパスを処理するための素晴らしいconfigureディレクティブを提供しません(誰もがrootであるとは限りません...)最も単純な場合、必要なものは次のとおりです。

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"

または、Linux以外のバージョンを使用する場合:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"

rpath」フラグは、特定のパスに必要なランタイムライブラリがあることをpythonに通知します。このアイデアをさらに活用して、標準のシステムの場所とは異なる場所にインストールされた依存関係を処理できます。たとえば、私のシステムでは、rootアクセス権がなく、ほぼ完全に自己完結型のPythonインストールを実行する必要があるため、構成行は次のようになります。

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"

この場合、私は、ライブラリをコンパイルだとPythonの用途(のようなffireadlineに、など)extlibのpythonディレクトリツリー自体内のディレクトリが。このようにして、python-$ {PYTHON_VERSION}ディレクトリをtarしてどこにでも着陸させることができ、「動作」します(衝突libcまたはlibm競合しない限り)。これは、同じボックスで複数のバージョンのPythonを実行しようとする場合にも役立ちますLD_LIBRARY_PATH。Pythonライブラリを変更し続ける必要がないか、間違ったバージョンのPythonライブラリを取得することを心配する必要がないためです。

編集:言及するのを忘れてPYTHONPATH環境変数をプレフィックスとして使用するものに設定せず、一部のモジュールのコンパイルに失敗した場合、コンパイルは文句を言います。たとえば、上記の例を拡張するには、上記でPYTHONPATH使用したプレフィックスにを設定しますexport PYTHONPATH=/apps/python-${PYTHON_VERSION}...の例


//、これは私が探しているもののように見えます。「python-versionディレクトリをtarしてどこにでも着陸させ、「動作する」(libcやlibmの競合に遭遇しない限り)」方法について、どこでもっと知ることができますか?これから別のstackoverflow.com質問をする価値があると思いますか?
Nathan Basanese 2015

//、また、どのように設定する必要があり$PYTHON_VERSIONますか?
Nathan Basanese

//、設定$PYTHON_VERSION後に設定します。でもで$PYTHON_VERSIONセット、コンパイラは文句を言うのにPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
ネイサンBasanese

//、これにはmakeコマンドおよびその他のインストールコマンドの変更が必要ですか?
Nathan Basanese 2015

1
bz2、curses、gdbm、lzmaなどが欠落している場合は、@ NathanBasaneseを最初にのプレフィックスを付けてコンパイルし/apps/python-${PYTHON_VERSION}/extlib、ライブラリとヘッダーがPythonのmakeプロセスが検索する適切な場所にあることを確認する必要があります。システムレベルのパッケージに関しては、ルートユーザーが事前にインストールするのに頼るのが難しいでしょう。または、コンパイルして上陸できる代替案を見つけるextlib
Foosh

21

私は同じ問題を抱えていて、このように解決しました:

libpythonがどこにあるか知っているなら、私はそれが/usr/local/lib/libpython2.7.so.1.0あなたの場合であろうと思います、あなたはそれにシンボリックリンクを作成することができます:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

次に、もう一度実行lddしてみて、機能するかどうかを確認します。


6

CentOS 7ミニマムにソフトウェアコレクションによってPython 3.5をインストールしました。それ自体はすべて正常に機能しましたが、簡単なCGIスクリプトを実行しようとしたときに、この質問で言及されている共有ライブラリエラーを確認しました。

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory

私は、すべてのユーザーに機能するシステム全体の永続的なソリューションを望んでいたため、.profileまたは.bashrcファイルへのエクスポートステートメントの追加を除外しました。Red Hatソリューションページに基づいた1行のソリューションがあります。それを指摘するコメントをありがとう:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

再起動後、シェルはすべて問題なく動作しますが、Webサーバーがまだ文句を言うことがあります。シェルとサーバーの両方で常に機能し、より一般的な別のアプローチがあります。私はここで解決策を見て、それが実際にここの回答の1つにも記載されていることに気付きました!とにかく、CentOS 7では、次の手順を実行します。

 vim /etc/ld.so.conf

私のマシンにはどれがありましたか:

include ld.so.conf.d/*.conf

だから私は新しいファイルを作成しました:

vim /etc/ld.so.conf.d/rh-python35.conf

そして追加:

/opt/rh/rh-python35/root/usr/lib64/

キャッシュを手動で再構築するには:

sudo ldconfig

それだけです。スクリプトは正常に機能します。

これは一時的な解決策でしたが、再起動しても機能しませんでした。

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

-v(冗長)オプションは、何が起こっているのかを確認するためのものです。/ opt / rh / rh-python35 / root / usr / lib64:libpython3.so.rh-python35-> libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1.0-> libpython3.5m.so.rh-python35-1.0

この特定のエラーはなくなりました。ちなみに、私はchownユーザーにapacheを実行して、その後のアクセス許可エラーを取り除く必要がありました。

ライブラリのディレクトリを見つけるためにfindを使用したことに注意してください。あなたも行うことができます:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0

私のVMでどれが返されますか:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

上記に示すように、どちらがldconfigに指定する必要があるパスです。


1
:あなたはを/etc/profile.dに行くと、それに次のファイルを作成することによって、自分自身にいくつかの問題を保存している可能性#!/bin/bashsource scl_source enable rh-python35、それに。access.redhat.com/solutions/527703
Doug

2

Solaris 11の場合

LD_LIBRARY_PATH_64python libsへのシンボリックリンクを解決するために使用します。

私の場合、python3.6 LD_LIBRARY_PATHは機能しませんでしたが、機能LD_LIBRARY_PATH_64しました。

お役に立てれば。
よろしく


1

これは私のために働いた...

$ sudo apt-get install python2.7-dev

こんにちは、これは正しい解決策ではありません。これは、カスタムビルドのPythonバイナリが、apt-getからインストールしたものからの.soを使用しているためです。これにより、同じバージョンの場合に問題が発生する可能性があります。または、Pythonソースコードを変更した場合、問題は解決されません。
中野梓

0

次のコマンドを使用してインストールしました:

./configure --prefix=/usr       \
            --enable-shared     \
            --with-system-expat \
            --with-system-ffi   \
            --enable-unicode=ucs4 &&

make

次に、rootユーザーとして:

make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0

次に、Pythonを実行しようとするとエラーが発生しました。

/ usr / local / bin / python:共有ライブラリの読み込み中にエラーが発生しました:libpython2.7.so.1.0:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

次に、rootユーザーからログアウトし、もう一度Pythonを実行しようとすると、正常に動作しました。


0

必要なのは、libpython [3または2] devファイルのインストールです。


-1

python-libをインストールするだけです。(python27-lib)。libpython2.7.so1.0をインストールします。手動で設定する必要はありません。


4
//、そして、例えば、CEntOS 6.3を使用している場合、これは機能しません。通常、人々はPythonをコンパイルして、システムPythonが奇妙なバージョンであるか、壊れているか、信頼できないか、またはシステム全体に触れないようにしたい場合に対処します。
Nathan Basanese
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.