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系统 ...
随机推荐
- 大规模 K8s 集群管理经验分享 · 上篇
11 月 23 日,Erda 与 OSCHINA 社区联手发起了[高手问答第 271 期 -- 聊聊大规模 K8s 集群管理],目前问答活动已持续一周,由 Erda SRE 团队负责人骆冰利为大家解答 ...
- 锁对象-条件对象-synchronized关键字
1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...
- 使用Lock接口来解决线程安全的问题
package cn.itcast.demo16.Demo09.Lock;import java.util.concurrent.locks.Lock;import java.util.concurr ...
- 1.ElasticSearch相关概念
1.为ElasticSearch设置跨域访问 http.cors.enabled: truehttp.cors.allow-origin: "*" 2.什么是ElasticSear ...
- leetcode,两个排序数组的中位数
先上题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 ...
- 漏洞扫描器-AWVS
目录 介绍 漏洞扫描 网络爬虫==漏洞分析.验证 主机发现 子域名探测 SQL注入 HTTP头编辑 HTTP监听 介绍 AWVS为Acunetix Web Vulnarability Scanner的 ...
- 关于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的问题
问题所在: 1.连接数据库一个是密码是否正确, 2.driver是否对, 3.有么有jar包冲突,
- C语言程序设计:二分查找(折半查找)
目录 C语言程序设计:二分查找(折半查找) 1.什么是二分查找 2.二分查找的优点 3.二分查找的缺点 4.二分查找原理 5.源代码实现 6.后话 C语言程序设计:二分查找(折半查找) 1.什么是二分 ...
- Arcpy按属性(字段值)不同将shp分割为多个独立shp_适用点线面矢量
利用代码可以进行批量处理,安装有10.5及以上版本ArcGIS可以使用工具Split by attributes完成上述任务 # -*- coding: utf-8 -*- # Import syst ...
- 如何高效地把Spring boot学到能干活的程度
Spring boot要学什么?要学到什么程度?以及相关的学习方法是什么?这些很难量化,但极好形容:需要学到能帮你找到一份工作的程度. 任何脱离工作脱离实际的学习,都是没有意义的.比如程序员运行通 ...