2013년 3월 1일 금요일

[Python] 어느날 import sqlite3 가 실패하기 시작했다

우선 배경 설명부터 하자. OS X 환경에서 Homebrew를 통해 Python 및 기타 여러가지를 설치하고 사용하는 터미널 유저이다. 그리고 업무로 sqlite3를 이용하는 스크립트를 작성하고 있다. 일단은 잘 돌아가고 잘 사용하고 있는 스크립트이다.

그런데 어느날 부터 이 스크립트가 오동작 하기 시작했다. sqlite3 모듈을 import 하는 데서 오류가 발생하는 것이었다.

이 문제를 해결하기 위해 삽질을 수 시간 했다. pysqlite를 지웠다 재설치 하기를 수 회, brew로 sqlite3를 지우고 재설치도 수 회 했다, 설치된 경로에 파일이 제대로 있나 확인도 해 보는 등 다양한 삽질을 하였다.

그럼에도 문제는 쉽게 해결되지 않았다.

참고로 이 문제의 내용은 이렇다:
>>> import sqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.3/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/usr/local/Cellar/python/2.7.3/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: dlopen(/usr/local/Cellar/python/2.7.3/lib/python2.7/lib-dynload/_sqlite3.so, 2): Library not loaded: /usr/local/lib/libsqlite3.0.8.6.dylib
  Referenced from: /usr/local/Cellar/python/2.7.3/lib/python2.7/lib-dynload/_sqlite3.so
  Reason: image not found
image not found 라는 이유라니 Python 코딩을 시작한 이래로 처음 보는 오류다.

어쨌든 문제의 원인은 dylib 로딩이 실패하기 때문에 발생하는 건데 왜 갑자기 이러는지는 잘 몰랐다.

그런데, Homebrew가 이 문제의 원인이었다는 것을 알게 되었다. 정확하게 말하자면, homebrew를 통해 업그레이드를 하는 과정에서 dylib 빌드 관련 문제가 발생한다. 참고로 전체 패키지 업그레이드는 아래 커맨드를 이용한다.
$ brew update
$ brew upgrade
설치된 패키지 버전업을 위해 종종 이렇게 실행하곤 하는데 이 과정 도중에 sqlite3가 업그레이드 된 적이 있었나보다. 이 설치 과정에서 dylib이 문제가 발생한다.

해결

문제를 해결하는 방법은 의외로 간단했다.
$ brew rm sqlite python
$ brew install python
즉 sqlite와 python을 둘 다 지우고 python만 다시 설치하면 된다. 이 후 import 문제는 해결되었다.

왜 sqlite를 지우고 다시 설치하지 않을까? 이유는 python 패키지에 dependency로 sqlite가 포함되어 있기 때문이다. 그래서 Python을 설치하면 sqlite3도 함께 빌드되고 dylib도 정상적으로 빌드된다.

이 후 잘 동작하였고 문제가 해결되었다. 삽질은 괴롭지만 해결되고 나면 속시원해야 되는데 왜 기분이 더 더러운걸까 -_-;;;;

관련링크: https://github.com/mxcl/homebrew/issues/17312

댓글 없음 :