设置 setuptools 以创建可用 headers 的可导入包
Set setuptools to create cimportable package with headers availible
我尝试实现答案 ,但我一直坚持从一个包导入另一个包。
代码在这里:https://github.com/iamishalkin/setuptools_cython_question
我想要的是从 wrapper 文件夹中得到一个独立的包 wrap
这样你就可以在没有 cust
包的情况下使用它。
而且我还希望能够通过从 wrap
.
继承 FuncWrapper
class 来创建自定义函数
我的工作:
- 首先我在
wrapper
文件夹中 运行 python setup.py bdist_wheel
(我想这就是我做错的地方,因为它只给我二进制文件)
- 下一个
pip instal dist/(some_name).whl
- 接下来,我将
import wrap
和 include_dirs=wrap.get_include()
添加到 custom/setup.py
,就像在 numpy
中所做的一样
- 我 运行
python setup.py bdist_wheel
在 custom
文件夹中,这失败了,在第一步中没有创建除二进制文件之外的文件
所以问题是:如何将.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 的东西,从来没有真正担心分发太多,所以我不是专家——但这看起来是标准方法.
我尝试实现答案
代码在这里:https://github.com/iamishalkin/setuptools_cython_question
我想要的是从 wrapper 文件夹中得到一个独立的包 wrap
这样你就可以在没有 cust
包的情况下使用它。
而且我还希望能够通过从 wrap
.
FuncWrapper
class 来创建自定义函数
我的工作:
- 首先我在
wrapper
文件夹中 运行python setup.py bdist_wheel
(我想这就是我做错的地方,因为它只给我二进制文件) - 下一个
pip instal dist/(some_name).whl
- 接下来,我将
import wrap
和include_dirs=wrap.get_include()
添加到custom/setup.py
,就像在numpy
中所做的一样
- 我 运行
python setup.py bdist_wheel
在custom
文件夹中,这失败了,在第一步中没有创建除二进制文件之外的文件
所以问题是:如何将.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 的东西,从来没有真正担心分发太多,所以我不是专家——但这看起来是标准方法.