2020년 10월 20일 화요일

Perl script와 같은 위치에 있는 모듈을 쓰고 싶다면

세균 유전체 염기서열에 삽입된 박테리오파지의 유전체, 즉 prophage의 서열을 찾고자 할 때 종종 PHASTER 서버를 사용하였다. 매우 잘 만들어진 웹서버이지만 너무 자주 유지보수를 위해 서비스를 중단하는 일이 많다. 왜 이렇게 자주 휴업 중이란 말인가...


다른 분석용 웹 서버, 또는 단독으로 실행되는 프로그램이 없을지 검색을 해 보았다. 2009년에 PLoS One에 실린 ProphET라는 프로그램이 눈에 뜨였다(GitHub 링크). 단독 설치하여 실행이 가능하고 phage genome database를 스스로 업데이트할 수 있다는 점이 마음에 들었다. BioConda 채널에서 제공하는 conda package로 설치하는 것이 아니라 몇 개의 외부 프로그램과 Perl module을 설치한 뒤 소스를 git로 클로닝하여 INSTALL.pl로 설치하는 매우 고전적인 방법을 사용하고 있었다. Perl module 설치를 위해 conda를 사용할지, 'perl -MCPAN -e shell'을 사용할지, 혹은 더 간단하게 cpan을 사용할지 잠시 고민을 하였다. 아, 그러고보니 요즘은 cpanm도 있구나.

여담이지만 요즘 conda로 뭔가를 설치하려면 시간이 점점 많이 걸린다. 심지어 conda 프로그램 자체는 몇달째 업데이트가 안된다. 'conda update -n base conda'를 실행하면 하루 종일 다음과 같은 상태에서 뱅글뱅들 돌기만 한다.

$ conda update -n base conda
Collecting package metadata (repodata.json): done
Solving environment: -

설치를 마치고 프로그램에 포함된 샘플 파일을 이용하여 분석을 해 보았다. 입력물은 염기서열(FASTA)과 GFF 파일이 필요하다. 샘플 파일은 결과가 잘 나왔는데, 내가 준비한 파일은 되는 것도 있고 에러가 발생하는 것도 있었다. GenBank 파일을 받아서 seqret로는 FASTA를, bp_genbank2gff3.pl로는 GFF3 파일을 만들었는데 왜 성패가 갈리는지를 모르겠다. 에서 메시지를 보면 GFF 파일의 양식에서 문제를 일으키는 것 같다. ProphET 사용 설명에 의하면 GFFLib 패키지('Perl library to manipulate GFF files')의 gff_rewrite.pl을 써서 전환하여 사용하면 된다고 한다. GFFLib은 ProphET 셋업 과정에서 설치된다고 하는데 그것은 사실이 아니다.

Git clone 명령을 사용하여 GFFlib을 클로닝하였다. Perl script가 있는 위치에 8개의 Perl module이 있다. Perl script를 열어보면 module의 위치를 지정하는 라인이 보이지 않았다. 이런 상태에서 제대로 실행을 하려면, 스크립트가 있는 위치에서 실행을 해야 된다. 이는 상당히 번거로운 일이다. @INC에는 늘 현 디렉토리('.')가 포함되지만, 다른 위치에서 Perl 스크립트를 실행한다면 모듈을 찾지 못하는 것이 당연하다.

$ /data/apps/GFFLib/gff_rewrite.pl 
Can't locate GFFFile.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /data/apps/GFFLib/gff_rewrite.pl line 13.

Perl script와 module이 전부 /data/apps/GFFLib/에 있다고 가정하자. 다른 위치에서 이를 실행하는 방법을 알아보자.

가장 간단하게는 perl -I/data/apps/GFFLib program.pl이라고 실행하여 Perl 인터프리터를 실행할 때 모듈이 있는 위치를 지정하면 된다. '소문자 엘'이 아니고 '대문자 아이'이니 조심하자.

또는 'export PERL5LIB=/data/apps/GFFLib'를 먼저 실행한 다음에 Perl 스크립트를 실행하면 된다. 이 값은 @INC 배열의 가장 앞에 추가된다. export 명령 없이 'PERL5LIB=/data/apps/GFFLib'라고만 하면 안된다.

마지막으로는 Perl 스크립트의 시작 부분에 다음과 같은 use 명령을 넣는 것이다. 

use FindBin;
use lib "$FindBin::Bin";

'usr lib "/data/apps/GFFLib";'을 삽입해도 당장은 작동하겠지만, 프로그램 설치 디렉토리를 바꾸는 경우 에러를 유발할 것이다.

Perl module의 설치 위치에 대한 지식은 매우 기본적인 것인데 무지한 상태에서는 이와 관련된 에러 메시지에 직면했을 때 신속하게 대처를 하지 못한다. 약간의 공부를 통해서 불필요한 두려움을 제거하는 것이 현명한 일이 아닐까?

댓글 없음: