大石泉のジト目は万病に効く

今はまだ効かないがそのうち効くようになる

PyMOLインスコバトル2021

PyMOLのインストールでコケまくったので、書く。

ハイライト

PyMOLについて

分子の形を見られるオープンソースソフトウェア。pythonで動作し、水素結合などの表示やアミノ酸配列からの分子設計も可能。後期の頭にインストールしていた、pymol.orgの提供するPyMOLの体験期間30日が終わってしまったので、情報を渡すことでもらえる学生版アカウントより多くの機能が使えるというオープンソース版のPyMOLをインストールすることにした。

pymol.org

経過

近づく期限切れへの対処を考えるのになんだかんだ思い立ってから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で同じ問題にぶつかっている記事があった。これによればpep425tagsutils.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周りに修正が必要

参考文献

(2022/07/04 追記) 「pymol callable」でググったらこの記事がトップに来るようになってた。そんなことある?

*1:実際には、3.10のパスを通して3.7はpython37で起動するようにした