Python 设置setuptools以创建标题可用的cimportable包

Python 设置setuptools以创建标题可用的cimportable包,python,cython,setuptools,Python,Cython,Setuptools,我试图实现这个答案,但我一直坚持从一个包到另一个包的cimporting 代码如下: 我想要的是从包装器文件夹中获得一个独立的包wrap,这样您就可以在没有cust包的情况下使用它 我还希望能够通过从wrap继承FuncWrapper类来创建自定义函数 我所做的: 首先,我在wrapper文件夹中运行python setup.py bdist_wheel(我想这就是我做错的地方,因为它只提供二进制文件) 下一步pip instal dist/(某些名称)。whl 接下来,我将import wr

我试图实现这个答案,但我一直坚持从一个包到另一个包的cimporting

代码如下:

我想要的是从包装器文件夹中获得一个独立的包
wrap
,这样您就可以在没有
cust
包的情况下使用它

我还希望能够通过从
wrap
继承
FuncWrapper
类来创建自定义函数

我所做的:

  • 首先,我在
    wrapper
    文件夹中运行
    python setup.py bdist_wheel
    (我想这就是我做错的地方,因为它只提供二进制文件)
  • 下一步
    pip instal dist/(某些名称)。whl
  • 接下来,我将
    import wrap
    include\u dirs=wrap.get\u include()
    添加到
    custom/setup.py
    中,就像在
    numpy
  • 我在
    custom
    文件夹中运行
    python setup.py bdist_wheel
    ,但失败了,在第一步,除了二进制文件之外,没有创建任何文件
所以问题是:如何将
.pxd
文件添加到最终的包中

我还尝试了
sdist
,它不编译cython代码,只是复制它。

正如我在评论中所说的那样。这需要一个稍微不同的结构:

| setup.py
+ wrapper
   | wrap.pxd
   | wrap.pyx
   | __init__.py # just so it's recognised as a package
                 # may be unnecessary with recent Python versions
然后,setup.py创建一个名为wrapper的“包”(这是根据您的版本修改的,因此可以进一步简化):

请注意,我已将扩展名更改为“wrapper.wrap”,以确保它是作为包的一部分安装的。然后,
package_data
能够识别.pxd文件作为要安装的
wrapper
的一部分。除非你把它放在一个“包”里,否则这是行不通的

然后安装它。我刚刚用python3 setup.py安装了它,但是我确信通过一个轮子也能做同样的事情


对于要使用您的文件的其他模块,它非常简单:

from wrapper.wrap cimport FuncWrapper
另一个模块的setup.py不需要什么特别的东西-您肯定不需要像
include\u dirs=wrap.get\u include()
这样的东西

如果你想有一个不需要子模块的接口,你可以这样做

from wrapper cimport FuncWrapper
然后只需使用一个包含以下内容的
\uuuuu init\uuuuuuuuuu.py

from .wrap import *
from wrapper.wrap cimport * # relative import is a little broken in Cython I think
以及
\uuuu init\uuuu.pxd
包含:

from .wrap import *
from wrapper.wrap cimport * # relative import is a little broken in Cython I think


我确信还有其他方法可以做到这一点——我只真正使用过setuptools来编译Cython的东西,从未真正担心分发太多,所以我不是专家——但这似乎是标准方法。

你检查过了吗?我想答案是从我从未真正理解setup.py开始的,它只是似乎忽略了包装data@ArdaAytekin这是解决特定问题的好方法(如果允许更改C接口);
BinaryOp
版本仍然需要某种方法来安装.pxd文件,才能用作库(否则,用户无法轻松地从
BinaryOp
继承
cdef类,因此它并不能真正避免这种情况problem@ArdaAytekin是的,我看到了,但不幸的是我无法更改c代码谢谢,我也在github上找到了示例,但还没有实现,因为我的问题是,当我将
从wrap cimport*
添加到
\uuu init\uuuu.pxd
生成自定义我得到
\uuu init\uuuuuuu.pxd:1:0:'wrap.pxd'未找到
如果我没有这样做,那么当我调用
PyClass().py\u wrap(add,5,5)
时,我得到
参数'func'的类型不正确(应该是wrap.FuncWrapper,得到wrapper.FuncWrapper)
我已经编辑了答案,因此
\uuuu init\uuuu.p*
有效(我还必须删除从wrap.pxd导入自身的稍微奇怪的尝试)我已经应用了这些更改,但这并没有解决类型的问题。我用疑问更新了github repo。我的同事用诗歌解决了这个问题,当我理解了解决方案后,我将在这里分享