gpt4 book ai didi

cython - 如何准备cython子模块

转载 作者:行者123 更新时间:2023-12-01 12:20:54 27 4
gpt4 key购买 nike

我有三个问题,但相关,但我不知道如何将它们分开。我发现了很多关于这些问题的信息,比如 submodule extension , hierarchy , 关于 empty __init__.py file ,以及如何cythonize multiple pyx files .但是当我一起尝试它们时,我无法让它们工作。

我准备了一个 small repo一起思考解决问题的代码示例。我什至检查了一些 projects listed 的代码使用 cython,但仍然不知道如何同时做三件事。

  • 清空 __init__.py 文件:

在一个项目中(所有文件都是 pyx(如果需要的话还有 pxd)),__init__.pyx 包含所有的他们,当有 __init__.py 文件时,导入它不会加载“.so”,而是加载空的 init。

  • cythonize 多个文件:

当不是准备包含模块所有元素的 __init__.py 时。喜欢:

cythonize(['factory.pyx', 'version.pyx'])

生成的“.so”导入引发异常:

>>> import barfoo
(...)
ImportError: dynamic module does not define init function (PyInit_barfoo)

如果需要在__init__.py中写点什么,就和前面的问题有关

  • 子模块:

其实这就是主要问题。 singleton.pyx 将成为子模块的一部分,假设 utils 将被模块中的其他元素使用。

对于示例,在 setup.py 中添加了一个子模块(简称为 subm)作为另一个扩展。我放的比主要的早(我不知道这是否真的有什么不同,我没看到)。

>>> import barfoo
>>> import barfoo.subm
(...)
ImportError: No module named 'barfoo.subm'

分开来看,这些食谱有效,但放在一起我就不行了。当混合使用“py”和“pyx”文件时,“__init__.py”似乎是必需的。这些示例解释了如何使用多个文件进行 cythonize,但不包括导入的最后一个关键点。并且子模块没有完成如何从一个地方或另一个地方导入它们(在导入基础模块时导入子模块,或在指定时导入可选导入)。

最佳答案

感谢 oz1 的评论和 DavidW , 我有 solution .是的,这三件事结合在一起。

  • 非常重要是在 setup.py 中导入时的顺序。即使是 PEP8并没有说导入应该按字母顺序排序,还有其他指南(如 reddit 的)确实如此,我通常会遵循:

当先导入 cythonize 然后导入 setup 时,将导致调用 cythonize(find_pyx()) 时,结果将是distutils.extension.Extension 对象列表。

from setuptools import setup, find_packages
from Cython.Build import cythonize

setuptools 必须在 cython 之前导入,然后 cythionize() 的结果将是 setuptools.extension 的列表。可以传递给 setup() 调用的扩展对象

  • 重要理解 __init__ 的含义:

所有包含包含的 __init__.pyx 文件都已删除,每个 .pxy 文件都生成自己的 .so 二进制文件。

只要它们的目录包含 __init__.py 文件,主模块和子模块就会存在,就像纯 python 代码一样。

在我链接的示例中,文件 barfoo/__init__.py 不为空,因为我希望 import barfoo 提供对 version 等元素的访问()Factory()。然后,这个 __init__.py 就像普通的纯 python 一样导入它们。

  • 对于子模块:

子模块 和它自己的 __init__.py 文件类似。在此示例中,import barfoo 将执行 from .factory import Factory,后者将调用 from barfoo.subm import Bar,然后 subm 将可用。

但是如果子模块没有以这种次要方式导入,用户将可以通过调用 import barfoo.subm 来访问它。

关于cython - 如何准备cython子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com