programing

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

padding 2023. 7. 22. 09:31
반응형

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와 마찬가지로 표준 집합을 재정의하는 함수가 있는 공유 라이브러리를 나열합니다.이러한 기능은 loader /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

첫 번째 양식이 비어 있으면 첫 번째 양식을 사용합니다(빈 문자열과 같거나 전혀 없음). 두 번째 양식이 비어 있지 않으면 두 번째 양식을 사용합니다.내보내기 사용을 기록합니다.

다음 항목을 확인합니다.libcurl.so모듈이 python 라이브러리 경로와 구별되고 분리된 시스템 라이브러리 경로에 있습니다.

"빠른 해결책"은 이 경로를 다음에 추가하는 것입니다.LD_LIBRARY_PATH변수.그러나 시스템을 넓게(또는 계정을 넓게) 설정하는 것은 좋지 않은 아이디어입니다. 일부 프로그램이 라이브러리를 찾거나 보안 구멍을 열어서는 안 되는 방식으로 설정할 수 있기 때문입니다.

예를 들어, "로컬로 설치된 라이브러리"가 에 설치되어 있는 경우,/usr/local/lib이 디렉터리를 에 추가/etc/ld.so.conf(텍스트 파일임) 및 실행ldconfig

이 명령은 캐싱 유틸리티를 실행하지만 로더 시스템이 작동하는 데 필요한 모든 "상징 링크"도 만듭니다.놀라운 것은make install은 아직 libcurl이 하지 않았다면 수행하지 못했을 수 있습니다./usr/local/lib에 ./etc/ld.so.conf이미.

의 PS: 가이있습다니 가능성이 ./etc/ld.so.conf에는 을포하것오직은는함만 포함됩니다.include ld.so.conf.d/*.conf디렉터리 경로를 추가한 후에도 디렉터리 경로를 추가하거나 포함할 디렉터리 내에 새 파일을 만들 수 있습니다.요▁run세▁to▁dont▁forget를 실행하는 것을 잊지 마세요.ldconfig다음에

조심하세요.이것을 잘못하면 시스템을 망칠 수 있습니다.

추가로: 해당 버전의 libcurl에 대해 python 모듈이 컴파일되었는지 확인합니다.일부 파일을 다른 시스템에서 복사한 경우에는 항상 작동하지 않습니다.의심스러운 경우 모듈을 실행할 시스템에서 모듈을 컴파일합니다.

LD_를 설정할 수도 있습니다.우선 pycurl을 컴파일할 때 사용자 환경의 /usr/local/lib에 대한 RUN_PATH를 실행합니다.이렇게 하면 C 확장 모듈의 RPATH 특성에 /usr/local/lib가 포함되어 실행 시 LD_LIBRARY_PATH를 설정할 필요 없이 실행 시 라이브러리를 찾을 위치를 자동으로 알 수 있습니다.

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

sudoln - s /opt/sys/lib/libcurl.so /usr/lib/libcurl.so .4

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

하지만 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 및 -I-R과 -I의

여기서 작동하는 것은 pyenv와 같은 버전 관리자를 사용하는 것입니다. 이 관리자는 프로젝트 환경과 패키지 버전을 운영 체제와 분리하여 잘 관리할 것을 강력히 권장합니다.

는 OS 와 같은 되었습니다.pyenv install 3.7-dev(내가 사용하는 버전).

언급URL : https://stackoverflow.com/questions/1099981/why-cant-python-find-shared-objects-that-are-in-directories-in-sys-path

반응형