Python 设置setuptools以创建标题可用的cimportable包
我试图实现这个答案,但我一直坚持从一个包到另一个包的cimporting 代码如下: 我想要的是从包装器文件夹中获得一个独立的包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
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。我的同事用诗歌解决了这个问题,当我理解了解决方案后,我将在这里分享