728x90

애플실리콘 기반의 맥북이 등장하면서 세상이 참 행복해졌습니다. 베터리도 오래가고 이륙하지도 않고... 이렇게 쾌적한 맥 운영체제는 간만에 느껴보는 즐거움이었습니다. 하지만 의외의 장소에서 복병을 만나게 될줄은 몰랐고 비슷한 짜증을 경험할 수 있는 누군가(아마도 미래의 나...)를 위해 메모를 남겨 둡니다. 뜬금 없이 왜 애플실리콘 이야기인가...는 글을 읽으시면서 알 수 있게 됩니다. 


맥 환경에서 운영체제 패키지 관리를 위해 Homebrew를 보통 사용하게 됩니다. python의 유명한 라이브러리 중 하나인 magic을 사용하기 위해서는 운영체제 환경에 libmagic 패키지를 설치해 둘 필요가 있습니다. 

  1. virtualenv 로 가상 환경 구성 및 activate
  2. pip install 로 requirements.txt의 항목 설치

를 하고 디버깅을 시작하는데 import magic 에서 에러가 발생했습니다. 가상 환경에서 magic 패키지가 잘 설치되어 있고 brew 로 libmagic 설치를 확인해봐도 아무런 문제가 없는데 python이 계속 libmagic이 설치되었는지 확인하라고 짜증을 내더군요. 네, 저도 짜증이 나기 시작했습니다. 

% python3
Python 3.8.2 (default, Apr  8 2021, 23:19:18) 
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import magic
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "......./venv/lib/python3.8/site-packages/magic.py", line 176, in <module>
    raise ImportError('failed to find libmagic.  Check your installation')
ImportError: failed to find libmagic.  Check your installation

 

구글과 함께 문제의 원인과 해결방법을 찾아보면 대부분 패키지가 잘 설치되었는지 확인해봐라, brew 로 libmagic 설치하면 된다 류의 답변이 대부분입니다. 하지만 그 어떤 방법도 동작하지 않았습니다. 왜냐하면 python 패키지든 OS 패키지든 필요한 건 문제없이 다 설치되어 있었기 때문입니다.

두가지 방향으로 다시 조사를 시작했습니다. 범인은 brew와 pip 둘 중 하나일 것이라고 보고 brew에서 설치하는 libmagic과 pip를 통해 설치하는 magic(패키지명은 이것도 libmagic입니다)에 무슨 문제가 있는가... 하는 접근이었습니다. 먼저 발견한 흥미로운 단서는 brew에서 나왔습니다.

https://docs.brew.sh/FAQ

애플실리콘이 등장하면서 homebrew가 사용하는 기본 prefix 경로가 바뀌었다는 이야기가 FAQ에 등재되어 있었습니다. 기본 경로가 달라졌다는 것은 brew를 통해서 설치되는 패키지들도 경로가 달라졌다는 말이 됩니다. 그래 뭐 바뀌었겠지... 하다가 문득, python libmagic 패키지가 절대경로로 라이브러리를 참조하나? 싶은 생각이 들었고 python libmagic의 github 저장소를 들러보았습니다.

 

ahupp/python-magic

A python wrapper for libmagic. Contribute to ahupp/python-magic development by creating an account on GitHub.

github.com

유레카!

python libmagic 패키지가 운영체제의 libmagic 라이브러리를 참조하는 코드는 하드 코딩된 몇 가지 절대 경로를 탐색하도록 만들어져 있었습니다. 그 경로중 하나는 바로 brew가 인텔과 애플실리콘 환경에서 변화가 생긴 바로 그 경로였습니다. 오우... 코드에 기여할 수 있는 것인지 혹은 이미 이슈가 올라왔는지...는 조금 후에 생각하기로 하고 libmagic의 설치 경로를 확인해보고 symlink를 만들어 추정이 맞는지 시험해 보기로 했습니다.

(venv) % brew info libmagic
libmagic: stable 5.40 (bottled)
Implementation of the file(1) command
https://www.darwinsys.com/file/
/opt/homebrew/Cellar/libmagic/5.40 (339 files, 8.4MB) *
  Poured from bottle on 2021-05-18 at 15:25:48
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/libmagic.rb
License: Cannot Represent
==> Analytics
install: 13,403 (30 days), 39,666 (90 days), 127,530 (365 days)
install-on-request: 3,672 (30 days), 11,365 (90 days), 34,209 (365 days)
build-error: 0 (30 days)

 

우려했던, 그리고 Homebrew FAQ에서 알려줬던 것처럼 운영체제 패키지는 /opt/homebrew/Cellar/libmagic/{버전} 경로에 설치가 되어 있었습니다. 해당 경로에 진입하여 libmagic.dylib 의 정확한 경로를 확인하고 /usr/local/lib 로 이동해서 symlink 를 만들었습니다. 

% pwd        
/usr/local/lib
% ln -s /opt/homebrew/Cellar/libmagic/5.40/lib/libmagic.dylib libmagic.dylib
%

 

symlink 까지 만들어주고 다시 코드를 실행하니 import magic 구문에서 문제가 더 이상 발생하지 않았습니다. 보통 python 에서 패키지 문제가 생기면 1) 가상 환경에 설치가 되었는지 보고, 2) 버전을 타는 문제가 있나 확인하는 정도로 문제가 해결되었는데 이번 케이스는 좀 그렇지 않아 시간을 은근히 쓸 수 밖에 없었네요. 금방 한것처럼 보이지만 구글링을 얼마나 했던지... 


 

728x90

+ Recent posts