- Cython の
Cython.Distutils
をsetup.py
で使わない方がいいかもしれない。 - .pyx を cython でコンパイルした .c もコミットしてしまえばいい
- でも、モヤモヤする
Cython.Distutils の困ったところ
Cythonでは、setup.py
用の関数が用意されています。
# setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension("example", ["example.pyx"])]
)
これを使えば、「誰でも python setup.py install
でビルドできるようになる」わけではありません。当たり前ですが、setup.py
を実行する前にCython自体を予めインストールしておく必要があるのです1。
自分が使うツールならまだ我慢できますが、PyPIなどで公開するならば、pip install hoge
だけでインストールできおるようにしたいものです。
僕がやったこと
Cython.Distutils
は使わず、setuptools
標準の機能だけを使うようにし、
cythonで生成したC言語のソースをGitレポジトリにコミットしてしまいました。
これによりインストール時にはcythonが不要になります。
レポジトリにコミットしている(主要な)ファイル:
setup.py
_pyjq.pyx <-- cython言語のソースコード(C言語ライブラリを呼び出す部分)
_pyjq.c <-- cython言語のソースコードを cython でコンパイルして生成したC言語のソース
# setup.py
from setuptools import setup
from setuptools.extension import Extension
from setuptools.command.build_ext import build_ext
setup(
cmdclass={"build_ext": build_ext},
ext_modules=[Extension("_pyjq")]
)
モヤモヤするところ
Gitレポジトリを運用するときは、大体どこでも、
- レポジトリにはソースコード(.py や .pyx)だけをコミットする
- 中間生成物(.pyc や .o) はコミットしない
- ビルド結果(.exe や .wheel)もコミットしない
というルールで運用していると思います。
今回追加したC言語のソースは、.pyx から生成できる中間生成物なので、ルールに従えばコミットするべきではない・・・。
でも、例えばGo言語の場合go generate
で自動生成したファイルをGitレポジトリでコミットしたりするので、.c
をコミットするのもあり・・・だと思います。
-
.wheel形式(ビルド済みバイナリ)を配布するならこの問題は起きません。なので「全アーキテクチャ向けのwheelを提供する」も1つの解決策ではあるでしょう。 ↩