« ^ »

Cythonを使う

所要時間: 約 2分

Evolution Gym というツールを使おうと思い、依存パッケージをインストールした所、インストールに失敗する状況があるようだ。私の環境では、 h5pywhl をインストールしていたため、ビルドは発生しておらずビルド済みバイナリをインストールしてた。しかしソースコードからビルドする際には上手くいかないようだった。そこで原因となっている 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 --inplace
running build_ext
インストールする。

ビルドとインストールができたら Python のインタラクティブシェルを起動し、 helloworld モジュールをインポートする。

import helloworld
Hello world!
helloworldモジュールをインポートする。

「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 ObjectID

from ~ 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)

Cython-3.0.0での更新

該当のissueもあった。

https://github.com/cython/cython/pull/4904

過去のコードはビルドできない事もありそうだ。