gpt4 book ai didi

python - 设置 setuptools 以创建具有可用 header 的可导入包

转载 作者:行者123 更新时间:2023-12-01 00:39:16 29 4
gpt4 key购买 nike

我尝试实现答案https://stackoverflow.com/a/57480599/7482208 ,但我坚持从另一个包导入一个包。

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

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

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

我做什么:

  • 首先,我在 wrapper 文件夹中运行 python setup.py bdist_wheel (我想这就是我做错的事情,因为它只给我二进制文件)<
  • 下一步pip install dist/(some_name).whl
  • 接下来,我将 importwrapperinclude_dirs=wrap.get_include() 添加到 custom/setup.py,就像在 中完成的那样>numpy
  • 我在 custom 文件夹中运行 python setup.py bdist_wheel 但失败了,第一步,除了二进制文件之外,没有创建任何文件

所以问题是:如何将 .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 然后创建一个名为包装器的“包”(这是根据您的版本进行修改的,因此可以进一步简化):

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 的一部分。 除非您将其放入“包”中,否则这不起作用

然后安装它。我刚刚使用 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 的东西,从来没有真正担心分发太多,所以我不是专家 - 但这看起来是标准方法。

关于python - 设置 setuptools 以创建具有可用 header 的可导入包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57493310/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com