[python] Python 실행 파일이 libpython 공유 라이브러리를 찾을 수 없음

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을 어디에서 찾을 수 있습니까?



답변

다음을 시도하십시오 :

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

에 없는 경우 /usr/local/lib설치 한 폴더로 교체하십시오 .libpython2.7.so.1.0/usr/local/lib

이것이 작동하고 변경 사항을 영구적으로 만들려면 두 가지 옵션이 있습니다.

  1. 추가 export LD_LIBRARY_PATH=/usr/local/lib사용자에 .profile홈 디렉토리에 (당신이 쉘을 사용하는 경우에만이 작동하는로드 새로운 쉘 인스턴스가 시작될 때이 파일). 이 설정은 사용자에게만 영향을줍니다.

  2. 추가 /usr/local/lib/etc/ld.so.conf실행 ldconfig. 이것은 시스템 전체의 설정입니다.


답변

내 묘비 모자를 쓰고 …

이 문제를 해결하는 가장 좋은 방법은 컴파일 타임입니다. 어쨌든 하나의 설정 접두어이므로 공유 라이브러리를 찾을 위치를 실행 파일에 명시 적으로 지정할 수도 있습니다. OpenSSL 및 기타 소프트웨어 패키지와 달리 Python은 대체 라이브러리 경로를 처리하기위한 멋진 구성 지시문을 제공하지 않습니다 (모든 사람이 루트가 아는 것은 아닙니다 …) 가장 간단한 경우 필요한 것은 다음과 같습니다.

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

또는 비 리눅스 버전을 선호하는 경우 :

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

rpath“플래그는 파이썬에게 특정 경로에 필요한 런타임 라이브러리가 있음을 알려줍니다. 표준 시스템 위치와 다른 위치에 설치된 종속성을 처리하기 위해이 아이디어를 더 활용할 수 있습니다. 예를 들어, 내 시스템에서는 루트 액세스 권한이 없으며 거의 ​​완전히 자체 포함 된 Python을 설치해야하므로 configure 행은 다음과 같습니다.

./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"

이 경우에는 내가 라이브러리를 컴파일하고 그 파이썬 사용 (같은 ffi, readline로 등) extlib파이썬 디렉토리 트리 자체 내에서 디렉토리. 이렇게하면 python-$ {PYTHON_VERSION} 디렉토리를 tar하고 어디든지 착륙시킬 수 있으며 “작동”합니다 (달리지 libc않거나 libm충돌 하지 않는 경우 ). 또한 동일한 상자에서 여러 버전의 Python을 실행하려고 할 때 도움이됩니다. 계속 변경 LD_LIBRARY_PATH하거나 잘못된 버전의 Python 라이브러리를 선택 하지 않아도됩니다 .

편집 : 언급 한 것을 잊어 버렸습니다 . PYTHONPATH환경 변수를 접두사로 사용하는 것으로 설정하지 않고 일부 모듈을 컴파일하지 못하면 예를 들어 위의 예제를 확장하고 위의 PYTHONPATH사용 된 접두어로 예를 들어 export PYTHONPATH=/apps/python-${PYTHON_VERSION}


답변

나는 같은 문제가 있었고 이런 식으로 해결했다.

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하여 작동하는지 확인하십시오.


답변

나는 파이썬 3.5 설치 소프트웨어 모음을 최소화 CentOS는 7. 모두 자체적으로 잘 작동했지만 간단한 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 파일에 export 문을 추가하는 것을 배제하기 위해 모든 사용자에게 작동하는 시스템 전체 영구 솔루션을 원했습니다. Red Hat 솔루션 페이지를 기반으로 한 줄 솔루션이 있습니다. 그것을 지적하는 의견에 감사드립니다.

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

다시 시작한 후에는 셸에서 모두 정상이지만 때로는 웹 서버가 여전히 불평합니다. 셸과 서버 모두에서 항상 작동하는 또 다른 접근 방식이 있으며 더 일반적입니다. 나는 여기 에 해결책을 보았고 실제로 여기에 대한 답변 중 하나에서 언급되었다는 것을 깨달았습니다! 어쨌든 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 (verbose) 옵션은 무슨 일이 있었는지 확인하는 것입니다. 나는 그것을 보았습니다 : / 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후에 권한 오류를 없애기 위해 사용자에게 아파치를해야했습니다.

라이브러리의 디렉토리를 찾기 위해 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에 제공해야 할 경로는 무엇입니까?


답변

Solaris 11에서

LD_LIBRARY_PATH_64파이썬 라이브러리에 대한 심볼릭 링크를 해결하는 데 사용하십시오 .

내 경우에는 python3.6 LD_LIBRARY_PATH이 작동하지 않았지만 작동했습니다 LD_LIBRARY_PATH_64.

도움이 되었기를 바랍니다.
문안 인사


답변

이것은 나를 위해 일했다 …

$ sudo apt-get install python2.7-dev


답변

다음 명령을 사용하여 설치했습니다.

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

make

이제 루트 사용자로서

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

그런 다음 파이썬을 실행하려고 시도하고 오류가 발생했습니다.

/ usr / local / bin / python : 공유 라이브러리로드 중 오류 : libpython2.7.so.1.0 : 공유 객체 파일을 열 수 없음 : 해당 파일 또는 디렉토리가 없음

그런 다음 루트 사용자로부터 로그 아웃하고 다시 Python을 실행하려고 시도했지만 성공적으로 작동했습니다.