Evolution Gym というツールを使おうと思い、依存パッケージをインストールした所、インストールに失敗する状況があるようだ。私の環境では、 h5py は whl をインストールしていたため、ビルドは発生しておらずビルド済みバイナリをインストールしてた。しかしソースコードからビルドする際には上手くいかないようだった。そこで原因となっている h5py の該当のバージョンのソースコードをダウンロードしビルドしてみる事にした。tarballを解凍しビルドコマンドを実行するとエラーが発生する。それは Cython によるエラーだった。このエラーのトラブルシューティングをするために Cython について知る必要が出てきた。そこでCythonについて考える事にした。
Hello world
まずは公式ドキュメントに記載されている一番最初の部分だけをおさらいする事にした。
pyx ファイルを作成する。今回は print 関数を使って"Hello world"を出力しているだけだから Cython を使う意味はないけれど、まずはここから始める。
print("Hello world!")helloworld.pyx をビルドしてインストールするために、 setup.py を用意する。
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("helloworld.pyx")
)準備が整ったらインストールする。
python setup.py build_ext --inplacerunning build_ext
ビルドとインストールができたら Python のインタラクティブシェルを起動し、 helloworld モジュールをインポートする。
import helloworldHello world!
「Hello world!」が表示される事が確認できた。
該当のエラーは何か?
問題となったエラーは、他のモジュールをインポートしようとして、 Expected an identifier と言われている。
Error compiling Cython file:
------------------------------------------------------------
...
# License: Standard 3-clause BSD; see "license.txt" for full license terms
# and contributor agreement.
from .defs cimport *
from ._objects cimport class ObjectID
^
------------------------------------------------------------
h5py/h5t.pxd:13:23: Expected an identifier
Error compiling Cython file:
------------------------------------------------------------特に class の所にマークが付いている。
from ._objects cimport class ObjectIDfrom ~ cimport class ~ という構文が使えるものなのか調べてみた所、どうやらこの構文は、削除されたようだった。"動くけれど動くとは言っていない"といった具合だったのかもしれない。
The undocumented, untested and apparently useless syntax from somemodule cimport class/struct/union somename was removed. The type modifier is not needed here and a plain cimport of the name will do. (Github issue #4904)
該当のissueもあった。
https://github.com/cython/cython/pull/4904
過去のコードはビルドできない事もありそうだ。