【问题标题】:Porting a Simple Python module to Cython将一个简单的 Python 模块移植到 Cython
【发布时间】:2017-04-17 19:39:17
【问题描述】:

假设我有一个目录“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

但我不清楚我应该如何将其分解为单独的文件,也不清楚我应该如何修改安装脚本。

【问题讨论】:

    标签: python cython distutils


    【解决方案1】:

    实际上不可能构建包含子模块的单个 Cython 扩展。我认为您最好的选择是构建大量单独的 Cython 库。

    只需将所有 .py 重命名为 .pyx 即可生成一堆 Cython 扩展。结构将与以前相同。我会排除模块 __init__.py 并将其保留为纯 Python(在这种情况下 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=[])
    ]
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2016-04-24
      • 2023-03-28
      • 2011-06-06
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多