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