LoginSignup
3
2

More than 5 years have passed since last update.

Cython では .pyx をコンパイルした .c もコミットすべき(かも?)

Last updated at Posted at 2018-07-28
  • Cython の Cython.Distutilssetup.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 をコミットするのもあり・・・だと思います。


  1. .wheel形式(ビルド済みバイナリ)を配布するならこの問題は起きません。なので「全アーキテクチャ向けのwheelを提供する」も1つの解決策ではあるでしょう。 

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2