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系统 ...
随机推荐
- day20 系统优化
day20 系统优化 yum源的优化 yum源的优化: 自建yum仓库 使用一个较为稳定的仓库 # 安装华为的Base源 或者使用清华的源也可以 wget -O /etc/yum.repos.d/Ce ...
- 零基础学习java------day12------数组高级(选择排序,冒泡排序,二分查找),API(Arrays工具类,包装类,BigInteger等数据类型,Math包)
0.数组高级 (1)选择排序 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置 ...
- 2019广东工业大学新生杯决赛 I-迷途的怪物
题目:I-I-迷途的怪物_2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛) (nowcoder.com) 将(p-1)^n 按照多项式定理拆开,会发现只有一项没有p,其余项都有p,可直接约掉. ...
- Docker学习(二)——Docker容器使用
Docker容器使用 1.Docker客户端 命令docker可以查看到Docker客户端的所有命令选项. 命令docker command --help更深入的了解指定的Do ...
- Linux磁盘分区(三)之查看磁盘分区常用命令
Linux磁盘分区(三)之查看磁盘分区常用命令转自https://blog.csdn.net/x356982611/article/details/77893264 1.df df -T 总的 ...
- Templates and Default Arguments
Default parameters for templates in C++: Like function default arguments, templates can also have de ...
- Jmeter初级入门教程
<jmeter:菜鸟入门到进阶>系列 创建一个简单的自动化脚本 创建线程组[Thread Group]: 右击[TestPlan]选择[Add]--[Thread(Users)]--[Th ...
- Redis慢查询配置和优化
目录 一.介绍 二.参数配置 sql动态配置 配置文件设置 三.sql操作 四.优化 一.介绍 慢查询只记录redis执行时间,并不记录redis服务到客户端之间的网络问题. 超过多少毫秒的才被记录 ...
- Gitlab更改项目间的fork提交关系
目录 一.前情提要 二.实际操作 一.前情提要 1.dzsw/cgd_xx项目,通过fork按钮在dzsw_dev组下面同步了一个项目 2.但是现在dzsw/cgd_xx项目因为没法提交合并请求,一点 ...
- Tableau使用折线图和饼图的组合
一.订单日期拖拽至列-右键天(具体到年月日) 二.订单日期拖拽至筛选器-年月-随机选择一个月的数据 三.创建计算字段-LOD-销售额 {EXCLUDE[类别]:SUM([销售额])} 四.销售额和刚刚 ...