【发布时间】:2017-10-18 00:34:30
【问题描述】:
我有三个问题,但相关,我不知道如何很好地拆分它们。我找到了很多关于这些问题的信息,比如submodule extension、hierarchy、关于empty __init__.py file,以及如何cythonize multiple pyx files。但是当我一起尝试时,我无法让它们发挥作用。
我准备了一份small repo 一起思考已解决问题的代码示例。我什至检查了一些使用 cython 的 projects listed 的代码,但仍然不知道如何同时做三件事。
- 空的 __init__.py 文件:
在一个项目中(所有文件都是 pyx(和 pxd ifneedbe)),__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,但不包括导入的最后一个关键点。并且子模块没有完成关于如何从一个地方或另一个地方导入它们(在导入基本模块时导入子模块,或者在指定它们时可选导入)。
【问题讨论】:
-
您能描述一下您的文件布局(编译前后)吗?我不是 100% 清楚这个问题,但我认为您正在尝试将多个 .pyx 文件编译为一个 .so 文件,但这是行不通的。每个 .pyx 文件都需要生成自己的 .so 文件
标签: cython