2016년 4월 7일 목요일

CentOS 6.7의 Python 2.6을 업그레이드하는 문제(SGA preqc 실행에 성공하다!)

파이썬은 참 좋은 도구라고 생각한다. 내가 파이썬으로 직접 스크립트를 만들지 않으면서 이런 의견을 낸다는 것은 좀 어울리지 않지만 말이다. 만약 업무를 위해 단 하나의 (스크립트) 언어를 공부해야 한다면 나는 당연히 파이썬을 추천하겠다. 아쉽게도 나의 현실은 언제나 Perl이다...

초급 수준의 파이썬 강좌를 들으면서 느낀 점은 참으로 합리적으로 잘 설계된 도구라는 것이다. 그러나 한가지 불편한 점을 꼽으라면 라이브러리를 설치하고 관리하는 방법이 좀 지저분하다는(?) 것이다. 2.x과 3.x의 버전이 공존한다는 것도 그렇다. easy_install이니 pip니 setuptools니 하는 다양한 설치 및 관리 도구가 나를 혼란스럽게 한다.

더군다나 CenOS 6.7에 설치된 파이썬은 2.6.6이다. SGA preqc를 실행하려면 matplotlib이 필요한데, 최신 라이브러리는 2.6에서는 잘 돌지 않는 것 같다. 그렇다면 파이썬을 최소한 2.7 버전(현재 최신본은 2.7.11)으로 올리는 것을 적극 검토해야 한다.

우선 CentOS 6에서 파이썬 2.6을 상위 버전으로 업그레이드하는 것과 관련한 문서를 찾아보았다. 파이썬은 yum 등 시스템 관리에 필수적인 유틸리티와 연결되어 있어서 매우 주의깊게 업그레이드 과정을 거치지 않으면 안된다. 다음 글에 아주 상세한 과정이 나와 있다.

How to install Python 2.7 and Python 3.3 on CentOS 6

주의해야 할 것은 파이썬 2.7 소스를 받아서 압축을 풀고 컴파일을 할 때, make install 대신 make altinstall을 쓰라는 것이다. 그래야 기존에 있던 파이썬 체계를 덮어쓰면서 혼란을 일으키지 않는다. 이렇게 할 경우 파이썬 인터프리터는 /usr/local/bin/python2.7이라는 이름으로 설치된다. 자, 그러면 시스템에 원래 설치된 파이썬 2.6.6을 건드리지 않고 업그레이드하는 방법을 알아보자.

바로 virtualenv를 사용하는 것이다.


이것은 엄밀히 말하자면 파이썬을 업그레이드하는 것은 아니다. 기존에 설치된 것을 완전히 바꿔치기해야 진정한 의미의 업그레이드이다. 여기서 추구하는 것은 파이썬 ≥ 2.7이 필요한 작업을 할 때에만 이에 맞는 환경으로 전환하는 것이다. 바로 이것을 해 주는 일이 virtualenv이다. 이 도구는 작년말에 short read의 평가를 위한 프로그램 패키지인 khmer를 익히면서 알게 된 것이다. 가령 /path/to/mydata라는 디렉토리에서 작업을 하면서 파이썬 2.7이 필요하다고 가정하자. 반드시 작업 파일들이 이 하위에 있어야 함을 의미하지는 않는다. 시스템에 고유한 파이썬은 2.6이고, 2.7 버전은 make altinstall로 설치하였다고 가정하자. 그러면 다음과 같이 실행하라.
$ virtualenv -p /usr/local/bin/python2.7 /path/to/mydata
그러면 /path/to/mydata/ 하위에 bin/ lib/ include/ 파일이 생성되고 필요한 파일이 복사된다. 다음으로는 이렇게 입력한다.
$ source /path/to/mydata/bin/activate
(mydata) $
프롬프트가 바뀌었다. 이제 python이라고 치면 /path/to/mydata/bin에 복사된 파이썬 인터프리터가 불려진다. 라이브러리도 여기에 새로 복사된 것을 사용한다. 따라서 추가적인 라이브러리 설치도 이 환경 안에서 하면 된다.

SGA preqc 실행에 드디어 성공하다!

내가 파이썬 업그레이드를 심각하게 고민한 이유는 SGA preqc를 실행하고 나서 리포트 생성을 하는 과정에 어려움을 겪었기 때문이다. 만들어진 preqc 파일을 sga-preqc-report.py에 공급하면 다음과 같은 에러가 발생하였다.
  File "/usr/local/apps/sga/src/bin/sga-preqc-report.py", line 17, in
    from mpl_toolkits.axes_grid1 import make_axes_locatable
ImportError: No module named axes_grid1
파이썬 2.6 환경에 설치된 구버전의 matplotlib 라이브러리로는 해결이 되지 않았다. 그래서 위에서 설명한 방법으로 virtualenv 환경을 구축하고 그 안에서 필요한 라이브러리를 설치하였다.
$ pip install --upgrade pip
$ pip install matplotlib
설레는 마음으로 다시 sga-preqc-report.py를 실행하였다. 그랬더니 이번에는 새로운 에러가 발생하였다!
  File "./bin/sga-preqc-report.py", line 331, in plot_legend
    ax.legend(proxy_arts, names, 2, bbox_to_anchor=(0,1), borderaxespad=0.)
  File "/nas/project/39_Drs_Park_Pan_2012_Dec/01_NICEM_121214_SHPark/t_preqc_test/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 536, in legend
    raise TypeError('Invalid arguments to legend.')
TypeError: Invalid arguments to legend.
어휴, 이건 또 뭐람... 맨 마지막에 나타난 에러 메시지를 가지고 구글링을 하니 놀랍게도 해결책이 나와 있었다. 답변에 따르면 sga-preqc-report.py의 334번 라인을 고치면 된다.

Issue with sga-preqc-report.py: Invalid arguments to legend

드디어 PDF 파일로 된 리포트가 멋지게 만들어졌다. 이렇게하여 기술적 장벽을 또 하나 넘었다. 덕분에 파이썬 버전과 업그레이드에 대한 지식도 아주 조금 축적하게 되었다.

댓글 없음: