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系统 ...
随机推荐
- 【2021赣网杯web(一)】gwb-web-easypop
源码分析 <?php error_reporting(0); highlight_file(__FILE__); $pwd=getcwd(); class func { public $mod1 ...
- d3 CSS
CSS的inline.block与inline-block 块级元素(block):独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默认为浏览器的宽度,即就是100%宽. 行内元素(inline ...
- JFinal之ActiveRecord开发示例
JFinal独创Db + Record模式示例 JFinal配备的ActiveRecord插件,除了实现了类似Rails ActiveRecrod的功能之外,还实现了Db + Record模式,此模式 ...
- java 整型
byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0B就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0X就可以写十六进制数 一 ...
- 通过DT10获取程序执行过程中的实时覆盖率
DT10是新一代的动态测试工具,可以长时间跟踪记录目标程序执行情况,获取目标程序动态执行数据,帮助进行难于重现的Bug错误分析,覆盖率检测,性能测试,变量跟踪等等功能. 系统测试覆盖率,通常是用于判断 ...
- 【C#】【MySQL】C#连接MySQL数据库(一)代码
C#连接MySQL数据库 准备工作 1.环境安装 安装MySQL For Visual Studio<<点击进入官网下载 第一个要下载安装,第二个下载后将MySQL.data添加到Visu ...
- java的bio和nio写入及读取txt文件
一.bio的写入及读取 1.采用bio之BufferedWriter 写入文件 public static void main(String[] args) throws IOException { ...
- 『与善仁』Appium基础 — 24、等待activity出现
目录 1.什么是等待activity出现 2.wait_activity()方法 3.获取当前页面的activity方法 4.综合练习 1.什么是等待activity出现 在启动APP的时候,要配置包 ...
- C#生成pdf -- iText7 设置自定义字体和表格
itextsharp已经不再更新,由iText 7来替代 安装 nuget 安装 itext7 注册自定义字体 下载字体文件 .ttc或.ttf到项目目录,设置更新则拷贝到输出目录,这样构建的时候会把 ...
- xtra+binlog增量备份脚本
目录 一.备份原理 innobackupex原理 binlog原理 特点 备份策略 二.环境准备 开启binlog 创建授权用户 安装innobackupex 三.添加脚本 全量备份 增量备份 bin ...