Cython编译动态库、引用C/C++文件
将某些.py 编译成动态库
设置好要编译的module们:
compile_to_c_modules = [
'package.module'
]
将它们转换成cythonize可识别的参数:
def module_to_path(module):
"""转成路径形式"""
return module.replace('.', os.path.sep) + '.py'
def get_module_dir(module):
"""获得module所在的目录"""
dir_path, _ = os.path.split(module_to_path(module))
return dir_path
def make_extension(module):
"""转换成`cythonize`可识别的参数"""
ext_path = module_to_path(module)
if not os.path.exists(ext_path):
return None
return Extension(
module,
[ext_path],
include_dirs=['.'],
)
extensions = list(filter(lambda i: i is not None, [make_extension(name) for name in compile_to_c_modules]))
print('\n'.join([e.sources[0] for e in extensions]))
# package/module.py 该路径需要是相对setup.py来说的
然后在setup函数里配置它:
setup(
name='package_name',
packages=['pakcage'],
ext_modules=cythonize(extensions)
)
用管理员权限运行:
python setup.py build_ext
就能编译出动态库.so/.dll。加上inplace参数:
python setup.py build_ext --inplace
动态库就会在源文件所在的同一目录下,只要有动态库就可以正常import
默认情况下是编译出本机操作系统能用的动态库,但build_ext也有参数可以主动选择OS。
引用C/C++文件里的函数
- 首先需要有想使用的C/C++源文件、头文件
- 编写
.pyd文件,告诉后面要写的.pyx文件可以用哪些C里面的函数/类 - 编写
.pyx文件,用一层python函数/类来包装.pyd用到的那些C里面的函数/类 - 最后在python代码里引用
.pyx文件定义的类即可
如果想要运行,需要把.pyx文件之类的文件添加到cythonize函数的参数里,让它生成build_ext可以直接编译和链接的.c文件,最后需要通过build_ext编译成动态库才能运行
扩展
cythonize的作用
生成一些build_ext可以直接编译和链接的.c文件(如果在cythonize函数里设置参数的话,也可以转换出cpp文件),并返回ext_modules可以识别的Extension类实例。
如果把cythonize写在了setup函数里,那么但凡调用了setup函数(也即调用了cythonize函数,其实也就是执行任何python setup.py命令),就会生成这个.c文件。
build_ext的作用
把ext_modules指定的一些模块,编译和链接成动态库,参数--inplace可以把动态库就放在源码的位置。它只需要.c文件(或.cpp),如果是.py转出来的.c的话,到这一步.py可以不需要了。
Cython编译动态库、引用C/C++文件的更多相关文章
- Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...
- ndk学习8: 编译动态库
目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境) 手工编译静态库 老规矩还是先手工操作,知其然并知其所以然 需要用到的核心命令: gcc -g -c -fpic -W ...
- Linux gcc编译(动态库,静态库)
1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){ print ...
- gcc 动态编译 动态库路径
gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...
- Linux:编译动态库时遇到的错误relocation R_X86_64_32 against `a local symbol'
编译动态库时遇到如下错误: ... ... relocation R_X86_64_32 against `a local symbol' can not be used when making a ...
- netsnmp编译动态库
.编译动态库 将写完的snmp代理程序编译生成动态库 gcc -c -fpic telnetConfig.c -o telnetConfig.o -I/usr/local/net-snmp/inclu ...
- gcc 编译动态库和静态库
Linux C 编程入门之一:gcc 编译动态库和静态库 cheungmine 2012 参考: C程序编译过程浅析 http://blog.csdn.net/koudaidai/article/de ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
- Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件
项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...
随机推荐
- Linux学习 - 变量测试与内容替换
变量置换方式 变量y没有设置 变量y为空 变量y有值 x=${y-新值} x=新值 x空 x=$y x=${y:-新值} x=新值 x=新值 x=$y x=${y+新值} x空 x=新值 x=新值 x ...
- js 长按鼠标左键实现溢出内容左右滚动滚动
var nextPress, prevPress; // 鼠标按下执行定时器,每0.1秒向左移一个li内容的宽度 function nextDown() { nextPress = setInterv ...
- 【VSCode】检测到 #include 错误。请更新 includePath。已为此翻译单元(C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\i686-
win+r 运行cmd 输入"gcc -v -E -x c -"获取mingw路径: 我的: #include "..." search starts here ...
- VSCode上发布第一篇博客
在VSCode上发布到博客园的第一篇博客 前段时间在VSCode安装好插件WriteCnblog,多次检查writeCnblog configuration配置信息也是完全正确的,但是一直没能在VSC ...
- 【JavaWeb】【MySQL】【edu01】jdbc.properties配置文件的编写
前提准备 导入 mysql-connector-java-版本号 的jar包 下面为大家提供几个jar包下载地址 点击进入下载界面 >>推荐 MySQL官方 多版本选择 点击进入下载界面 ...
- Go语言核心36讲(Go语言实战与应用二十五)--学习笔记
47 | 基于HTTP协议的网络服务 我们在上一篇文章中简单地讨论了网络编程和 socket,并由此提及了 Go 语言标准库中的syscall代码包和net代码包. 我还重点讲述了net.Dial函数 ...
- Jenkins监控
目录 一.Monitoring插件 二.Prometheus监控 一.Monitoring插件 Monitoring插件(monitoring)使用JavaMelody,对Jenkins进行监控.插件 ...
- 分布式调用链跟踪工具Jaeger?两分钟极速体验
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Decorator 模式转载
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://tianli.blog.51cto.com/190322/35287 摘要:本文深 ...
- 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)
目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...