2009-02-04 7 views
2

저는 오늘 아침까지 MySQL 버전 4를 사용하는 공유 호스팅 서버에서 Python 스크립트를 실행하고 있습니다. 이제 버전 5가 있습니다. libmysqlclient_r.so.14를 찾을 수 없어서 파이썬 스크립트를 더 이상 MySQL에 연결할 수 없습니다 :파이썬에 libmysqlclient.so의 어떤 버전을 사용할 것인지 어떻게 알 수 있습니까?

/usr/lib/libmysqlclient.so.15 
/usr/lib/libmysqlclient.so.14 
/usr/lib/mysql/libmysqlclient.la 
/usr/lib/mysql/libmysqlclient.so 
/usr/lib/mysql/libmysqlclient_r.so 
/usr/lib/mysql/libmysqlclient_r.a 
/usr/lib/mysql/libmysqlclient_r.la 
/usr/lib/mysql/libmysqlclient.a 
/usr/lib/libmysqlclient.so 
/usr/lib/libmysqlclient_r.so 
/usr/lib/libmysqlclient_r.so.15 
/usr/lib/libmysqlclient_r.so.15.0.0 
/usr/lib/libmysqlclient.so.15.0.0 

그래서 제 질문은 이것이다 : 나는 파이썬을 알 수있는 방법 (버전 2.4.3) libmysqlclient의 버전

$ python my_script.py 
Traceback (most recent call last): 
File "my_script.py", line 6, in ? 
import MySQLdb 
File "/home/lib/python2.4/site-packages/PIL-1.1.6-py2.4-linux-i686.egg/__init__.py", line 19, in ? 

File "build/bdist.linux-i686/egg/_mysql.py", line 7, in ? 
File "build/bdist.linux-i686/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: libmysqlclient_r.so.14: cannot open shared object file: No such file or directory 

이는/usr/lib 디렉토리에 libmysqlclient의 여러 다른 버전이 있습니다 용도?

답변

5

SONAME (라이브러리 + 인터페이스의 전체 이름)이 바이너리의 일부이므로 동적 링커에 사용할 라이브러리 버전을 알릴 수 없습니다.

경우에 따라 호스트에 libmysqlclient_r.so.14를 업로드하고 이에 따라 LD_LIBRARY_PATH을 설정하면 공유 객체를 확인할 때 시스템 디렉토리를 추가로 검색 할 동적 링커를 알려줄 수 있습니다.

당신은 작동 LD_LIBRARY_PATH 있는지 ldd를 사용할 수 있습니다

$ ldd $path_to/_mysql.so 
... 
libmysqlclient_r.so.14 => $path_to_lib/libmysqlclient_r.so.14 
... 

그렇지 않은 경우가있을 것입니다 오류 메시지가 해결되지 않은 공유 객체에 대해.

물론 새로운 라이브러리를 사용하기 위해 MySQLdb를 다시 빌드하기 전까지는 임시 수정 사항 일 수 있습니다.

+1

이 문제를 일으킬 수있는 사람들에게.LD_LIBRARY_PATH를 다음과 같이 설정할 수 있습니다. (bash로 가정) export LD_LIBRARY_PATH =/usr/lib/mysql/: $ LD_LIBRARY_PATH 분명히/usr/lib ...가 라이브러리의 경로가됩니다. – user49913

0

하나의 해결책은 로컬 디렉토리를 갖도록 환경 변수를 설정하고 원하는 mysql 라이브러리의 버전을 복사 (또는 링크)하는 것입니다.

+0

안녕하세요 Sykora, 고마워요. 시도해 보았지만 효과가없는 것 같습니다. 파이썬이 PYTHONPATH에서 공유 객체를 찾게 될 것입니까? 내가 누락 된 또 다른 env 변수가 있는지 궁금하다. – Ben

+0

설명서에 따르면, _always_는 PYTHONPATH의 _after_ any를 검색하므로, 그 것이 작동하지 않는다면 다른 것이어야한다. – sykora

+0

이것은 파이썬의 자체 적재 가능 모듈 (Windows의 경우 .pyd, * ix의 경우 .so)에만 해당됩니다. libmysqlclient.so는 파이썬 모듈 _mysql.so에 의해 * 링크 된 또 다른 라이브러리입니다. PYTHONPATH에서 _mysql.so 만 찾습니다. – bobince

1

python-mysql (일명 MySQLdb)을 다시 컴파일해야 libmysqlclient의 새 버전에 링크 할 수 있습니다.

호스트가 원래 환경을 설정하지 않고 환경을 설정 한 경우 환경을 컴파일해야합니다.

/usr/lib/libmysqlclient.so.14

이 이전 libmysqlclient의 잔재처럼 보이는, 그리고 제거해야

. _r 및 .a (정적) 버전은 사라지고 라이브러리가 여전히 혼합되어있는 것을 원치 않으므로 혼동을 야기 할 수있는 위험이 있습니다. 당신 0.15에 libmysqlclient_r.so.14에서 심볼릭 링크를 만들 수있는 동안 클라이언트의 새 버전 당신이로 사용하고 싶은 기능에 대해 동일한 ABI가 일어난 경우

, 즉에만 작동 것 오래된 버전입니다. 버전 번호를 변경하는 것이 전체적으로 중요하기 때문에 거의 불가능합니다.

관련 문제