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と打ち込むとウィンドウが立ち上がることを確認しています。
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 が何かよくわかりませんでした・・・