创建pxd定义文件的最简单方法是什么,它只是简单地收集在pyx文件上复制的cdef,而不创建新的扩展名?
我的情况如下:我想在pxd文件(hp / src / common.pxd)中收集一些extern cdefs。我还添加了一些非extern cdef,其实现在common.pyx。
在另一个pyx文件(hp / src / _lib.pyx)中,我将其转换为扩展名,我会从常见文件中提取一些内容。
在setup.py文件中,我创建了以下扩展名:
Extension('hp._lib',
['hp/src/_lib.pyx'],
language='c++'),
通过这样做,不会创建common.cpp文件,因此看起来不会自动处理依赖项。这是第一个问题。
然后,手动运行'cython --cplus common.pyx'在目录hp / src中正确创建一个common.cpp文件,如果我将'hp / src / common.cpp'添加到扩展源列表中,命令python setup.py安装一切没有抱怨,但是,导入模块hp触发一个ImportError:没有名为common的模块...来自_lib.cpp ... 我被困在这里有什么想法吗?
答案 0 :(得分:3)
您可以使用include
声明包含其他文件中的素材。
请参阅此处的文档:
http://docs.cython.org/src/userguide/language_basics.html#the-include-statement
如果common.pxd
中有外部定义,commond.pyx
中有实现,则需要同时包含它们。例如,在_lib.pyx
:
include "common.pxd"
include "common.pyx"
然后,这些文件的内容将被编译到您的_lib
模块中,就好像它们在文本中包含在那一点一样。即,不会生成common.c
文件,而是包含_lib.c
。
在决定是否需要重新生成模块的.c
文件时,Cython编译器无法识别包含的更改,因此请记住在重新编译之前删除它。
答案 1 :(得分:0)
如果您完全按照.py文件构建.pyx和.pxd文件,那么您将获得更好的运气。这包括在setup.py
文件中为common.pyx制作扩展名。您可能希望尝试使用cythonize来处理依赖项。