t

OS X El Capitan에서 keras, tensorflow 설치하기

우분투 서버를 벗어나 신형 맥북프로에서 작업을 하게 되었다. Python package들을 설치 하다가 생각지도 못한 에러에 부딪혔는데, sudo 권한으로 설치를 하는데도 아래와 같은 permission error가 발생하는 것이었다.

$ sudo pip install jupyter
OSError: [Errno 1] Operation not permitted: '/xxx/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/xxx'

파일 권한도 문제 없고 sudo인데 왠 permission error인가 해서 간만에 열심히 구글링을 했다. 문제는 OS X El Capitan 부터 생긴 System Integrity Protection라는 신기한 정책이었다. Python package는 기본 셋팅이라면 /System아래에 우선적으로 설치를 시도하게 되는데, /System을 포함한 몇 개의 폴더들이 운영체제 차원에서 접근이 금지 되어 에러가 발생하는 것 이었다. 이를 해결하기 위해서는 아래와 같은 방법으로 System Integrity Protection 을 끄면 된다.

이렇게 /System폴더의 권한을 풀어놓으면 특별한 문제는 없지만, 조금 더 깔끔한 셋팅을 원한다면 아래 사항들을 추가 적용하면 좋을 것 같다. 여기부터는 El Capitan 뿐 아니라 OS X 에서 모두 해당되는 사항이다. Package version conflict을 막는 방법이다. 터미널에서 아래와 같은 명령어를 입력하면 python package 폴더 리스트를 볼 수 있다.

$ python -c "import site;print site.getsitepackages();"
['/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
'/Library/Python/2.7/site-packages']

El Capitan에서 아무 것도 건드리지 않았다면 위와 같이 나올 것이고, 아마도 다른 OS X에서도 마찬가지 일 것 같다. Package import 시 /System/.../python과, /Library/.../site-packages 두 군데에서 불러오고 당연히 첫번째 폴더를 우선적으로 체크하게 된다. 그런데 가끔 개별 패키지 설치 스크립트 안에 있는 명령 때문에 순서가 뒤바뀌는 경우가 있어서, 패키지 관리자 pip로 설치해도 첫번째 건너뛰고 두번째 폴더에 설치되는 경우가 있다. 이러다 보면 두 군데 다른 버전이 설치되고 import시 conflict이 나는 경우가 생기는데, 아래를 참고하시어 폴더 하나만 남겨놓는 것이 깔끔하다고 생각된다.

$ sudo rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy
$ sudo rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy
$ sudo vi /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py
def getsitepackages():
...
#elif sys.platform == 'darwin' and prefix == sys.prefix:
# sitepackages.append(os.path.join(prefix, "Extras", "lib", "python"))
#elif os.sep == '/':
# sitepackages.append(os.path.join(prefix, "lib",
# "python" + sys.version[:3],
# "site-packages"))
# sitepackages.append(os.path.join(prefix, "lib", "site-python"))
#else:
# sitepackages.append(prefix)
# sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
$ python -c "import site;print site.getsitepackages();"
['/Library/Python/2.7/site-packages']
$ pip install --upgrade numpy scipy keras jupyter
$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py2-none-any.whl
$ python -c "import numpy, scipy, keras, tensorflow"

comments powered by Disqus