[python] Python이 sys.path의 디렉토리에있는 공유 객체를 찾을 수없는 이유는 무엇입니까?

가져 오려고 해요 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']

어떤 도움이라도 대단히 감사하겠습니다.



답변

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는 많은 유닉스 계열 시스템에서 작동하지만 모든 시스템에서 작동하지는 않습니다. 예를 들어,이 기능은 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

비어있는 경우 첫 번째 양식 (빈 문자열과 동일하거나 전혀 존재하지 않음)을 사용하고 그렇지 않은 경우 두 번째 양식을 사용하십시오. export 사용에 유의하십시오 .


답변

libcurl.so 모듈이 python 라이브러리 경로와는 별개의 시스템 라이브러리 경로에 있는지 확인하십시오.

“빠른 수정”은이 경로를 LD_LIBRARY_PATH 변수에 추가하는 것입니다. 그러나 시스템 전체 (또는 계정 전체)를 설정하는 것은 나쁜 생각입니다. 일부 프로그램이 라이브러리를 찾거나 보안 허점을 열어서는 안되는 방식으로 설정할 수 있기 때문입니다.

“로컬로 설치된 라이브러리”가 예를 들어 / usr / local / lib에 설치된 경우이 디렉토리를 /etc/ld.so.conf (텍스트 파일)에 추가하고 “ldconfig”를 실행합니다.

이 명령은 캐싱 유틸리티를 실행하지만 로더 시스템이 작동하는 데 필요한 모든 “기호 링크”도 생성합니다. libcurl의 “make install”이 이미이 작업을 수행하지 않았다는 것은 놀랍지 만 / usr / local / lib가 이미 /etc/ld.so.conf에 없으면 불가능할 수 있습니다.

추신 : /etc/ld.so.conf에 “include ld.so.conf.d / *. conf”만 포함되어있을 수 있습니다. 그 뒤에 디렉토리 경로를 추가하거나 포함되는 디렉토리 내에 새 파일을 만들 수 있습니다. 그 후에 “ldconfig”를 실행하는 것을 잊지 마십시오.

조심해. 이것을 잘못하면 시스템이 망가질 수 있습니다.

또한, 파이썬 모듈이 libcurl의 해당 버전에 대해 컴파일되었는지 확인하십시오. 다른 시스템에서 일부 파일을 복사 한 경우 항상 작동하지는 않습니다. 확실하지 않은 경우 실행하려는 시스템에서 모듈을 컴파일하십시오.


답변

처음에 pycurl을 컴파일 할 때 사용자 환경에서 LD_RUN_PATH를 / usr / local / lib로 설정할 수도 있습니다. 그러면 C 확장 모듈의 RPATH 속성에 / usr / local / lib가 포함되므로 런타임에 LD_LIBRARY_PATH를 설정하지 않고도 런타임에 라이브러리를 찾을 위치를 자동으로 알 수 있습니다.


답변

똑같은 문제가있었습니다. 프로덕션 서버의 현재 curl에 영향을주지 않도록 curl 7.19를 / opt / curl /에 설치했습니다. libcurl.so.4를 / usr / lib에 연결하면 :

sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4

여전히 같은 오류가 발생했습니다! Durf.

그러나 ldconfig를 실행하면 저에게 연결이 만들어졌습니다. LD_RUN_PATH 또는 LD_LIBRARY_PATH를 전혀 설정할 필요가 없습니다. ldconfig를 실행하는 데 필요했습니다.


답변

위의 답변에 대한 보충으로-비슷한 문제에 부딪 히고 기본 설치된 파이썬으로 완전히 작동합니다.

으로 찾고있는 공유 객체 라이브러리의 예제를 호출하면 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

… 즉각 더 의미있는 오류 메시지가 나타납니다. 종속성 누락에 대한 것입니다!

여기에 적어 놓을 줄 알았는데-건배!


답변

내가 사용 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에 대한 설명을 보려면 입력 할 수 있습니다.


답변

나를 위해 여기서 작동하는 것은 pyenv 와 같은 버전 관리자를 사용하는 것입니다. 프로젝트 환경과 패키지 버전을 잘 관리하고 운영 시스템의 버전과 분리하는 것이 좋습니다.

OS 업데이트 후에도 동일한 오류가 발생했지만 pyenv install 3.7-dev(내가 사용하는 버전) 으로 쉽게 수정되었습니다 .