设置 setuptools 以创建可用 headers 的可导入包

Set setuptools to create cimportable package with headers availible

我尝试实现答案 ,但我一直坚持从一个包导入另一个包。

代码在这里:https://github.com/iamishalkin/setuptools_cython_question

我想要的是从 wrapper 文件夹中得到一个独立的包 wrap 这样你就可以在没有 cust 包的情况下使用它。

而且我还希望能够通过从 wrap.

继承 FuncWrapper class 来创建自定义函数

我的工作:

所以问题是:如何将.pxd个文件添加到最终包中。

我也试过 sdist 它不编译 cython 代码,只是复制它。

正如我在评论中所说,the Cython documentation recommends putting .pxd files in package_data to install them。这需要一个稍微不同的结构:

| 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 的 "package"(这是根据您的版本修改的,因此可以进一步简化):

from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext

NAME = "some_name"

ext_abc = Extension(name="wrapper.wrap",
                    sources=["wrapper/wrap.pyx"]
                    )

EXTENSIONS = [
    ext_abc
]

if __name__ == "__main__":
    setup(
        zip_safe=False,
        name=NAME,
        packages=["wrapper"],
        cmdclass={"build_ext": build_ext},
        ext_modules=cythonize(EXTENSIONS, language_level=3),
        package_data = {
            "wrapper": ["*.pxd"],
    },
        )

请注意,我已将扩展名更改为 "wrapper.wrap" 以确保将其作为软件包的一部分安装。然后 package_data 能够将 .pxd 文件识别为您要安装的 wrapper 的一部分。 这不起作用,除非你把它放在 "package" 中。

然后你安装它。我刚刚用 python3 setup.py install 安装了它,但我确信通过一个轮子在很大程度上做同样的事情。


要让另一个模块使用你的文件很简单:

from wrapper.wrap cimport FuncWrapper

其他模块的 setup.py 没有什么特别的 - 你绝对不需要像 include_dirs=wrap.get_include().

这样的东西

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

from wrapper cimport FuncWrapper

然后只需使用 __init__.py 包含:

from .wrap import *

和一个 __init__.pxd 包含:

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

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