将简单的Python模块移植到Cython

时间:2017-04-17 19:39:17

标签: python cython distutils

假设我有一个目录“pylib”,其中包含:

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实现相同的效果?也就是说,如果我只有一个文件,例如:

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 个答案:

答案 0 :(得分:1)

实际上不可能构建包含子模块的单个Cython扩展。我认为你最好的办法就是建立很多单独的Cython库。

只需将所有.py重命名为.pyx即可生成一堆Cython扩展。结构将与以前相同。我排除了模块__init__.py并将其保留为纯Python(在这种情况下,Python如何找到模块的规则are a little more complicated

您希望将所有.pyx文件列为setup.py中的单独扩展名:

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=[])
]

(并且可能还告诉setup.py整个cylib目录是一个包,就像使用distutils / setuptools和类似的纯Python模块一样。)< / p>