2021년 5월 28일 금요일

antiSMASH v5가 이렇게 설치하기 어려운 소프트웨어였던가?

antiSMASH는 유전체 서열로부터 이차대사물의 생합성 유전자군(BGC, biosynthetic gene cluster)를 예측하는 도구이다. 현재 버전은 5.x까지 나온 상태이다. 버전 3과 4에서는 지금 KAIST에 재직 중인 김현욱 교수가 개발에 참여하였던 것으로 안다.

파이썬 2.7 시절의 버전인 antiSMASH 4.x는 무난히 설치하여 잘 쓰고 있었다. 최신 버전을 설치하려니 생각보다 매우 어렵다. 설치 시 나오는 메시지를 구글에 때려넣고 검색을 거듭하여 해결 방법을 찾아 보았다. antiSMASH GitHub 웹사이트의 issue #234번에서 힌트를 얻어서 다소 복잡한 설치 명령어를 입력하여 겨우 설치에 성공하였다. GitHub의 파이썬 소스를 가져다가 저렇게 한 줄의 명령어로 설치하는 방법은 이번에 처음 써 보는 것이다.

$ conda create -n antismash5 "python>3" pip numpy "biopython=1.76" \
    helperlibs jinja2 pysvg-py3 bcbio-gff pyscss matplotlib scipy "scikit-learn>=0.19" \
    "diamond==0.9.*" "fasttree==2.1.*" "glimmerhmm==3.0.*" hmmer2 \
    "hmmer==3.1b2" "meme<=4.11.2" "muscle==3.8.*" "blast=2.2.*" prodigal
$ conda activate antismash5
$ python -m pip install git+https://github.com/antismash/antismash.git@5-1-2 OK!
$ download-antismash-databases # 일부만 성공, SSL 인증서 관련 에러 발생!

문제는 이것으로 전부가 아니라는 것. 위에서 보인 명령어 중 가장 마지막 것('download-antismash-database')를 실행할 때 SSL 인증서와 관련한 urllib의 에러가 난다. 짜증스러울 정도로 자주 만나던 에러다.

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1131)

REQUESTS_CA_BUNDLE 환경변수를 수정하는 것으로도 해결이 되지 않는다. 드디어 파이썬 소스 코드를 고쳐서 시도할 순간이 되었다. 이에 대한 해결 방법은 구글링을 하면 어렵지 않게 찾을 수 있다. 내가 참조한 글은 urllib request.py urlopen SSL 인증서 에러 문제 해결 SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]이다. 파이썬 문법을 잘 모르는 상태에서 소스 코드를 고치려니 참 부자연스럽다. download-antismash-database에서 호출하는 download_databases.py 스크립트를 vi로 열어서 앞부분에 import ssl을 적당히 삽입하고, 다음의 빨간색 줄에 해당하는 코드를 삽입한 것이 전부였다. urlopen() 안에 한 줄로 넣어 버리는 방법도 어디선가 읽은 적이 있었다.


이렇게 한 다음 문제의 스크립트를 재실행하면 에러가 났었던 clusterblast_20190415 데이터베이스의 다운로드 및 설치가 무사히 끝난다. antiSMASH용 데이터베이스의 위치는 다음과 같으므로, SSL 인증서 문제가 발생하지 않는 다른 전산망의 컴퓨터에서 받은 파일을 가져다가 덮어씌워도 될 것이다.

antismash5/lib/python3.8/site-packages/antismash/databases

새롭게 설치한 antiSMASH를 이용하여 Acineobacter baumannii의 complete genome sequence를 분석해 보았다. 분석 소요 시간은 얼마 되지 않는다. 결과 화면은 다음과 같다.


PYTHONHTTPSVERIFY라는 환경 변수를 0으로 설정하면 된다는 글도 있었다. 위에서 소개한 방법을 이용하여 다른 서버에 antiSMASH 프로그램을 설치한 뒤 'export PYTHONHTTPSVERIFY=0'을 실행하고 나서 download-antismash-database를 실행해 보았다. 그랬더니... 되긴 뭐가 돼! 결론적으로는 download_databases.py 스크립트를 수정하여 데이터베이스 설치를 완료하였다.

(antismash5) $ export PYTHONHTTPSVERIFY=0
(antismash5) $ download-antismash-databases
/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/scss/selector.py:26: FutureWarning: Possible nested set at position 329
  SELECTOR_TOKENIZER = re.compile(r'''
Downloading PFAM version 27.0
Downloading Pfam-A.hmm.gz: 100.00% downloaded.
Creating checksum of Pfam-A.hmm.gz
Extraction of Pfam-A.hmm.gz finished successfully.
Downloading PFAM version 31.0
Downloading Pfam-A.hmm.gz: 100.00% downloaded.
Creating checksum of Pfam-A.hmm.gz
Extraction of Pfam-A.hmm.gz finished successfully.
Downloading Resfam database
Downloading Resfams.hmm.gz: 100.00% downloaded.
Creating checksum of Resfams.hmm.gz
Extraction of Resfams.hmm.gz finished successfully.
Ensuring all cutoffs are present
Downloading ClusterBlast database.
Traceback (most recent call last):
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 1354, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 1252, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 1298, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 1247, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 1007, in _send_output
    self.send(msg)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 947, in send
    self.connect()
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/http/client.py", line 1421, in connect
    self.sock = self._context.wrap_socket(self.sock,
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/ssl.py", line 500, in wrap_socket
    return self.sslsocket_class._create(
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/ssl.py", line 1040, in _create
    self.do_handshake()
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/ssl.py", line 1309, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1131)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 82, in download_file
    req = request.urlopen(url)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 525, in open
    response = self._open(req, data)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 502, in _call_chain
    result = func(*args)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 1397, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/urllib/request.py", line 1357, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1131)>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/miniconda3/envs/antismash5/bin/download-antismash-databases", line 8, in <module>
    sys.exit(_main())
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 352, in _main
    download(args)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 330, in download
    download_clusterblast(args.database_dir)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 307, in download_clusterblast
    download_if_not_present(CLUSTERBLAST_URL, archive_filename, CLUSTERBLAST_ARCHIVE_CHECKSUM)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 207, in download_if_not_present
    download_file(url, filename)
  File "/opt/miniconda3/envs/antismash5/lib/python3.8/site-packages/antismash/download_databases.py", line 84, in download_file
    raise DownloadError("ERROR: File not found on server.\nPlease check your internet connection.")
antismash.download_databases.DownloadError: ERROR: File not found on server.
Please check your internet connection.

댓글 없음: