PyMOLのインストールでコケまくったので、書く。
ハイライト
- pipのホストでコケたところ
私が悪いミス - PyMOLの内部実装が壊れていたところ
実装側のミス
PyMOLについて
分子の形を見られるオープンソースソフトウェア。pythonで動作し、水素結合などの表示やアミノ酸配列からの分子設計も可能。後期の頭にインストールしていた、pymol.orgの提供するPyMOLの体験期間30日が終わってしまったので、情報を渡すことでもらえる学生版アカウントより多くの機能が使えるというオープンソース版のPyMOLをインストールすることにした。
経過
近づく期限切れへの対処を考えるのになんだかんだ思い立ってから4日くらいは経っているので、順に述べる。
情報集め
まず期限が切れるとどうなるのかを知らないので教授のところに訊きに行くことにした。講義が終わった後に質問に行き、講義の内容のついでにライセンスの有効化について尋ねる。
教授「いやー僕も今使っているこれが教員用ライセンスなのかわかんないんだよね、僕の懐から金が出てないことは確かだけど」
ええ?
教授「この講義もって何年かになるけど、ライセンスを作らなかったから使えなくなったって話は聞いたことないね」
なるほど?
このあたりで私が「分子の形見るのに支障がないなら別に無理にorgに情報捧げなくてもいいか」と考え始めたが、横から同じ講義を取っていた学生(もちろん名前は知らない)から「オープンソース版というものがありますよ」と教えられた。私も自称エンジニア、オープンソース版があると聞いたら使わないわけにはいかないじゃないか。彼に訊くところによれば、pymol オープンソース
と調べて上から2番目か3番目のQiita記事が優秀らしい。
見つけた記事いわく、4つのライブラリをインストールすれば使えるとのこと。
入らないwhl
さて、情報とアイテムが集まったところで早速インスコ。
> pip install Pmw-2.0.1-py3-none-any.whl
叩く。入った。次。
> pip install numpy-1.21.4+mkl-cp310-cp310-win_amd64.whl
叩く。赤文字。
ERROR: numpy-1.21.4+mkl-cp310-cp310-win_amd64.whl is not a supported wheel on this platform.
なるほど?既にpythonは3.10を入れているしpython -V
もちゃんと3.10に対応していると答える。
とりあえずエラーメッセージをGoogleに放り込んで調べる。
ふむ、pipの対応whlパターンはpythonのインタープリタで調べるのか。
>>> from pip._internal.pep425tags import get_supported >>> get_supported()
叩く。
>>> from pip._internal.pep425tags import get_supported Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'pip._internal.pep425tags'
は?
エラーメッセージで一番上に出てきた記事を見ると、環境にpip 10.0.1とある。これはいけない。pip21 whl 対応
で再度Google。
pip 20.1で同じ問題にぶつかっている記事があった。これによればpep425tags
はutils.compatibility_tags
に変更されたらしい。というわけで
>>> from setuptools.pep425tags import get_supported >>> get_supported()
これとは違う解決を見つけた記事もあったが、私の手元では動かなかった。二つの記事は両方ともpip 20.1だったのにどうして……
さて肝心のget_support()
で得られた結果がこちら
[<cp310-cp310-win_amd64 @ 2460352555392>, <cp310-abi3-win_amd64 @ 2460352547840>, <cp310-none-win_amd64 @ 2460352655296>, <cp39-abi3-win_amd64 @ 2460345828096>, <cp38-abi3-win_amd64 @ 2460352655552>, ...
cp310-cp310-win_amd64はばっちり対応しとるな、どういうことなんだ……
30分ほど格闘して、pipを単体でたたいた時のホストバージョンが3.7であるのではということに思い当たった。ならば、
> python -m pip install numpy-1.21.4+mkl-cp310-cp310-win_amd64.whl Successfully uninstalled numpy+mkl
OK*1。
さてここで私は賢いので、先ほど叩いたpipで入ったPmwは3.7の方へ入っていることに気づく。一応の期待を込めて確認。
> py -m pip list Package Version -------------- ---------- numpy 1.21.4+mkl pip 21.3.1 setuptools 57.4.0
うん、やっぱり入ってないな。
> py -m pip install Pmw-2.0.1-py3-none-any.whl > py -m pip install pymol_launcher-2.1-cp310-cp310-win_amd64.whl > py -m pip install pymol-2.6.0a0-cp310-cp310-win_amd64.whl
通った。再度確認。
>py -m pip list Package Version -------------- ---------- numpy 1.21.4+mkl pip 21.3.1 Pmw 2.0.1 pymol 2.6.0a0 pymol-launcher 2.1 setuptools 57.4.0
ヨシ!
起動
インストールしたら、当然起動する。
> PyMOL.exe
走った、と思ったらエラーメッセージが出てきた。
Traceback (most recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python310\Lib\site-packages\Pmw\Pmw_2_0_1\lib\PmwBalloon.py", line 204, in <module> if isinstance(cmd, Callable): AttributeError: module 'collections' has no attribute 'Callable' (C:\Users\user\AppData\Local\Programs\Python\Python310\lib\collections\__init__.py)
初手ランタイムエラーやったー!
起動時に1度だけ出るタイプのエラーであれば無視するという手もあったが、1秒も開けずに次々に新しいウィンドウが立ち上がって操作を邪魔するのでさすがに観念してバグ探しの旅に出ることにした。
製品デバッグ
幸いファイルパスはわかっているのでソースを見てやるかということで見る。どうやらcollections
がこのファイル内ではCallable
のためにしか呼ばれていないらしい。
どうせバージョンアップに伴うモジュールの配置換えかなんかでしょ。調べたら3.9からCallable
の動作不具合が報告されていた、やっぱりね。
じゃあこれの代替手段を探してやればいいのかと思ったら、「3.10.1からは修正されています」という文言が。私の環境はその3.10.1で見事にエラー吐いとるわけなんですが。
さらに調べてやると、公式ドキュメントにCallableの情報が。
collections.abc --- コレクションの抽象基底クラス
バージョン 3.3 で追加: 以前はこのモジュールは collections モジュールの一部でした。
なんでそういうことするかなぁ?ねえ?
まさか3.3になってからオープンソース版を入れた人間はことごとくこのバグを踏まされたのか?それにしては情報が皆無だったが。
とりあえず素直にimport文をfrom collection.abc import Callable
とし、呼び出しの行われている204行目をcollections.Callable
からCallable
に書き換えてやって保存。
PyMOLを落として再起動。……エラーウィンドウなし!ほかの挙動も問題なし!
デバッグを終わろう。
まとめ
- バージョンの違うpythonはどのコマンドでどれが動くかわかるようにしておこう
- PmwライブラリのPmwballon.pyのimport周りに修正が必要
参考文献
- オープンソース版PyMOLインストール (Windows)
- 【Python】.whlファイルをpipでインストールしようとして「○○.whl is not a supported wheel on this platform.」エラーが出た時の対応 - Qiita: pip 10.0.1
- get_supportedに躓いたのでその解決方法 - Qiita: pip 20.1 (動いてくれたほう)
- collections.abc --- コレクションの抽象基底クラス: 公式ドキュメント
(2022/07/04 追記) 「pymol callable」でググったらこの記事がトップに来るようになってた。そんなことある?
*1:実際には、3.10のパスを通して3.7はpython37で起動するようにした