Cython

2017-04-17 12 views
1
にシンプルなPythonモジュールを移植

のは、私はそれでこのでディレクトリ "pylib" があるとしましょう:Cython

pylab/funcs.pyを:

def add(a, b): 
    return a + b 

pylab/__ init__.py:

from .funcs import add 

次の操作を実行することが可能である:

$ python -c "import pylib as lib; print(lib.add(5, 6))" 
11 

同様の組織構造を持つCythonでどのように同じ効果を達成できますか?私はちょうど1つのファイルを持っている場合のように、ある

cylab.pyx:私は、セットアップスクリプトを作成することができます

def add(a, b): 
    return a + b 

setup.py:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 

extensions = [ # I will eventually be referencing C libraries 
    Extension('cylib', ['cylib.pyx'], libraries=[], library_dirs=[]) 
] 

setup(
    ext_modules = cythonize(extensions) 
) 

残りの部分はかなり単純な方法で動作します

$ ./setup.py build_ext --inplace 
[omitted] 
$ python -c "import cylib as lib; print(lib.add(5, 6))" 
11 

しかし、私が別のファイルに分割する方法や、セットアップスクリプトを変更する方法についてはわかりません。

答えて

1

サブモジュールを含む単一のCython拡張を構築することは実際には不可能です。あなたの最善の選択肢は、多くの個々のCythonライブラリを構築することだと思います。

すべての.pyを.pyxに変更して、一連のCython拡張を生成してください。構造は以前と同じになります。私はモジュール__init__.pyを除外し、その純粋なパイソン(Pythonはこの場合are a little more complicatedのモジュールを見つける方法についてのルールを維持したい

をあなたがsetup.pyで別の拡張として、あなたの.pyxのすべてのファイルを一覧表示します:。

extensions = [ # I will eventually be referencing C libraries 
    Extension('cylib.funcs', ['cylib/funcs.pyx'], libraries=[], library_dirs=[]), 
    Extension('cylib.something_else', ['cylib/something_else.pyx'], libraries=[], library_dirs=[]) 
] 

(あなたが同様の純粋なPythonモジュールでdistutils/setuptoolsを使用する場合と同様に、おそらくまた、全体cylibディレクトリがパッケージであることをsetup.pyを伝える。)