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

답변:


203

다음을 시도하십시오 :

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. 이것은 시스템 전체의 설정입니다.


이클립스와 함께 작동하도록 내보내는 방법이 있습니까? .profile에 추가했지만 Eclipse는 gdb를 시작할 수 없습니다. (참고 : ld.so.conf에 추가하면 작동합니다)
— Setheron

그래서 eclipse가 실행중인 환경 변수를 확인했으며 적절한 LD_LIBRARY_PATH가 있습니다. 나는 그것이 GDB를 시작할 때 어떤 쉘도 사용하지 않으므로 환경 변수를 얻지 못한다고 믿는다! 디버그 설정에서 libpython을 설정해도 gdb가 실제로로드 될 때에 만 도움이되지는 않습니다 (그러나 gdb 자체를로드하려면 lib가 필요합니다)
— Setheron

1
gdb명령 행에서 실행할 때 응용 프로그램을 성공적으로 디버그 할 수 있고 LD_LIBRARY_PATH가 터미널에 올바르게 설정되어 있습니까? 그렇지 않은 경우 .gdbinit파일에 LD_LIBRARY_PATH를 설정해야 합니다. 자세한 내용은이 답변을 참조하십시오. stackoverflow.com/a/7041845/156771
— Tamás

내 응용 프로그램의 실제 디버깅이 아닌 시작 gdb (python libs)에 LD_LIBRARY_PATH가 필요합니다. 지금까지 나는 ldconfig에서 설정하여 문제를 해결했습니다. 그러나 ZSHRC 파일에서 LD_LIBRARY_PATH를 가져 오기 때문에 CLI를 통해 응용 프로그램을 디버깅 할 수 있습니다.
— Setheron September

10
이것을 시도하는 모든 사람을위한 참고 사항 : "/ usr / local / lib"일 뿐이며 원래 "include ld.so.conf.d / *. conf"로 시작하는 "include"가 아닙니다.
— timss

79

내 묘비 모자를 쓰고 ...

이 문제를 해결하는 가장 좋은 방법은 컴파일 타임입니다. 어쨌든 하나의 설정 접두어이므로 공유 라이브러리를 찾을 위치를 실행 파일에 명시 적으로 지정할 수도 있습니다. 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}...


//, 이것은 내가 찾고있는 것 같습니다. "python-version 디렉토리를 타르 고 어디서나 착륙시켜"작동 "(libc 또는 libm 충돌이 발생하지 않는 경우)하는 방법에 대한 자세한 정보는 어디에서 찾을 수 있습니까 ? 이것으로부터 별도의 stackoverflow.com 질문을 할 가치가 있다고 생각하십니까?
— Nathan Basanese

// 또한 어떻게 설정해야 $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
— Nathan Basanese

//, make명령 및 기타 설치 명령을 수정해야합니까 ?
— Nathan Basanese

1
누락 된 bz2, curses, gdbm, lzma 등의 경우 @NathanBasanese 당신은 /apps/python-${PYTHON_VERSION}/extlib그들의 라이브러리와 헤더가 파이썬 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

나는 파이썬 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에 제공해야 할 경로는 무엇입니까?


1
: 당신은이 /etc/profile.d에 가서 거기에 다음의 파일을 생성하여 자신에게 몇 가지 문제를 저장 한 수 #!/bin/bash와 source scl_source enable rh-python35그것입니다. access.redhat.com/solutions/527703
— Doug

2

Solaris 11에서

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

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

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


1

이것은 나를 위해 일했다 ...

$ sudo apt-get install python2.7-dev

안녕하세요, 이것은 올바른 해결책이 아닙니다.이 후에는 사용자 정의 빌드 파이썬 바이너리가 apt-get에서 설치 한 .so를 사용하기 때문입니다. 동일한 버전을 사용하는 동안 문제가 발생하거나 파이썬 소스 코드를 수정 한 경우 노력을 기울이지 않습니다.
— Azusa Nakano

0

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

./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을 실행하려고 시도했지만 성공적으로 작동했습니다.


0

필요한 것은 libpython [3 또는 2] dev 파일 설치입니다.


-1

python-lib를 설치하십시오. (python27-lib). libpython2.7.so1.0을 설치합니다. 수동으로 설정하지 않아도됩니다.


4
// 그리고 만약 당신이 켜져 있다면 CEntOS 6.3? 이것은 작동하지 않으며 일반적으로 사람들은 시스템 파이썬이 이상한 버전이거나 깨지거나 신뢰할 수 없거나 전체 시스템을 건드리지 않는 다른 욕구를 처리하기 위해 파이썬을 컴파일하고 있습니다.
— Nathan Basanese
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.