栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

仅打包使用Cython编译的python库的二进制编译.so文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

仅打包使用Cython编译的python库的二进制编译.so文件

不幸的是,公认的设置答案

packages=[]
是错误的,并且可能破坏很多东西,例如可以在此问题中看到。不要使用它。而不是从dist中排除所有软件包,您应该仅排除将被cythonized并编译为共享对象的python文件。

下面是一个工作示例;它使用我的食谱中的问题从python
bdist_egg或bdist_wheel中排除单个源文件。示例项目包含

spam
具有两个模块的软件包
spam.eggs
spam.bacon
,以及
spam.fizz
具有一个模块的子软件包
spam.fizz.buzz

root├── setup.py└── spam    ├── __init__.py    ├── bacon.py    ├── eggs.py    └── fizz        ├── __init__.py        └── buzz.py

模块查找是在

build_py
命令中完成的,因此您需要使用自定义行为对其进行子类化。

简单案例:编译所有源代码,不例外

如果您要编译每个

.py
文件(包括
__init__.py
s),则覆盖
build_py.build_packages
方法已经足够,使其成为noop。由于
build_packages
不执行任何操作,因此根本不会
.py
收集任何文件,并且dist将仅包含cythonized扩展名:

import fnmatchfrom setuptools import find_packages, setup, Extensionfrom setuptools.command.build_py import build_py as build_py_origfrom Cython.Build import cythonizeextensions = [    # example of extensions with regex    Extension('spam.*', ['spam__init__.py']def not_cythonized(tup):    (package, module, filepath) = tup    return any(        fnmatch.fnmatchcase(filepath, pat=pattern) for pattern in cython_excludes    ) or not any(        fnmatch.fnmatchcase(filepath, pat=pattern)        for ext in extensions        for pattern in ext.sources    )class build_py(build_py_orig):    def find_modules(self):        modules = super().find_modules()        return list(filter(not_cythonized, modules))    def find_package_modules(self, package, package_dir):        modules = super().find_package_modules(package, package_dir)        return list(filter(not_cythonized, modules))setup(    name='...',    version='...',    packages=find_packages(),    ext_modules=cythonize(extensions, exclude=cython_excludes),    cmdclass={'build_py': build_py},)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634002.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号