假设我有一个目录“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
但我不清楚我应该如何将其分解为单独的文件,也不清楚我应该如何修改设置脚本。
答案 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>