magattacaのブログ

日付以外誤報

JupyterNotebookでpymolのimportに失敗した話

PyMOL便利ですよね!でっかいタンパク質の描画も綺麗で動きも速いですし。

便利なPyMOLがCUIでも使えるらしいと知り、初心者の味方 jupyter notebook で使おうとしたところいろいろと躓いたので備忘録を残します。

まず結論!

  • Pathを通して
  • ファイル名を変更「 _cmd.cpython-37m-darwin.so  _cmd.so

した!という話をだらだら書きます。

03/20追記
ファイル名変更よりも_cmd.cpython-37m-darwin.soシンボリックリンク_cmd.soを作成する方が安全とのことです。 @Ag_smith先生ありがとうございました!

PyMOLの状態

PyMOLは @Ag_smith 先生の記事macOS/CentOS 7/Ubuntu 18.04へのオープンソース版PyMOLのインストール方法 にしたがってインストールしました。ちなみにパソコンはMacBookProです。

brew tap brewsci/bio
brew install pymol

で、ターミナルでpymolと打ち込むとウィンドウが立ち上がることを確認しています。

f:id:magattaca:20200320162949p:plain

Jupyter notebookでimport error

早速 import ! そしてエラーが出た!

import pymol

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-f943b406a205> in <module>
----> 1 import pymol

ModuleNotFoundError: No module named 'pymol'

「pymolなんて名前の奴はない」と怒られました。・・・あるよ。。。

PATHを確認

色々みているとPATHが通っていないのがよくないのでは、ということだったので、 まずはPyMOLがどこにインストールされているか確認して見ることにしました。 (コピペでインストールしてるからソフトの居場所も分からない。)

立ち上げたPyMOLのウィンドウで、コマンドを打ち込む枠(「PyMOL>」と書いてあるところ)に以下を貼り付けました。

import sys
print(sys.path)

以下が表示されました。

['', '/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages', '/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages'] 

HomeBrew経由でインストールしたものは「Cellar」というディレクトリの下に入るそうです。 どうも「'/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages'」が怪しそうです(pymolって書いてあるから)。 こちらを使うことにしましょう。

PATHを通すも新たなエラーが!

.bash_profile にPATHを追加すれば良いようですが、自信がないのでjupyter notebookでテストしてみます。

以下を打ち込み・・・

# PyMOLへのPATHを通す
import sys
sys.path.append('/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages')

import pymol

新たなエラーを得た!

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-f943b406a205> in <module>
----> 1 import pymol

/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages/pymol/__init__.py in <module>
    581 # _cmd = sys.modules['pymol._cmd']
    582
--> 583 from . import cmd
    584
    585 cmd._COb = None

/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages/pymol/cmd.py in <module>
    102
    103         import re
--> 104         from pymol import _cmd
    105         import string
    106         import threading

ImportError: cannot import name '_cmd'

今回は ModuleNotFoundError ではなかったので、先ほど追加したPATHで当たりだったようです。 PyMOLの居場所はわかったものの、今度は_cmdというのが見つからないらしい。

FinderでPyMOLのディレクトリを確認すると、似た名前の「cmd.py」というファイルはありましたが、「_cmd.py」は見当たりませんでした。 ひょっとして名前を付け間違えたか?と思い、「cmd.py」を複製し、「_cmd.py」にファイル名を変えてみましたが異なるエラーがでただけでした。

そんなアホなことでは直らないですよねー。アンダーバー、なんか意味ありそうですし・・・。

それっぽいファイルの名前を変えたら動いた!

色々と調べてもさっぱりわからず、もう一度PyMOLのディレクトリを見直すと怪しげなファイルがありました。

_cmd.cpython-37m-darwin.so

拡張子が「.py」でなく名前が長いので素通りしていましたが、最初に「_cmd」と書いてあります。 開いてみても文字化けしてさっぱり中身がわからないファイルでしたが、 「.so」というのはMacOSで使われる共有ライブラリの拡張子("shared object"の略)だそうです。*1

意味がわかりませんでしたが、とりあえず重要っぽいファイルでファイル名が探しているものに似ている。 ・・・名前変えちゃえ!ということで、ファイルを複製して邪魔っぽい部分(.cpython-37m-darwin)を消し、 「_cmd.so」にしてみました。

で、もう一度jupyter notebookに戻りimportすると今度はエラーを出さずに実行できました! エラーが出ないだけだと不安なのでPATHを確認してみます。

import pymol
pymol.__path__

['/usr/local/Cellar/pymol/2.3.0/libexec/lib/python3.7/site-packages/pymol'] と表示されました! どうやら通したPATHも合っていたようです!

まとめ

そもそもPyMOLのCUIでどのような機能が使えるかわかっていないので、importはできているっぽいものの本当に正しく使えるのか? ファイル名を変更してしまったけどよかったのか?等々不安が残ります。とりあえずの備忘録として残しておきます。

おそらく間違っているように思います。詳しい方ご教示いただければ幸いです。

結局 cpython-37m-darwin が何かよくわかりませんでした・・・