问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何编译c文件中调用 cython

发布网友 发布时间:2022-04-29 17:54

我来回答

1个回答

热心网友 时间:2022-05-11 01:27

以下总结出几种在Python 中调用 C/C++ 代码的方法
--------------------------------------------------------------------
发现做便捷的是使用popen
from os import popen
popen('/home/pengyan/Downloads/VIC/sanxia/vicNl -g /home/pengyan/Downloads/VIC/sanxia/xings_global')
popen('/home/pengyan/Downloads/VIC/sanxia/rout /home/pengyan/Downloads/VIC/sanxia/xings_rout')
?? 目前还不会用python 切换文件目录
可以采用绝对路径,但是好像绝对路径时,计算速度变慢
-------------------------------------------------------------------
  使用ctypes 模块调用 C 动态库
  从Python2.5 开始, Python 开始提供 ctypes 模块来提供对 C 语言编译的动态库文件的调用。注意, 这里特指C 的动态库 ,用C++ 编译的动态库 ctypes 虽然能够加载,但调用时的函数名已经由于 C++ 的重载特性被加以修改,难以调用。 使用 ctypes 调用 C 动态库的好处在于不用进行额外的开发,可以直接使用编译好的动态库。 ctypes 提供了完整的 C 类型封装,也支持自定义类型,大大减少在调用过程中的工作量。 ctypes 的使用很简单,只需熟悉 python 封装与 C 中的对应关系即可。以下用一个简单的例子来说明:
  from ctypes import * #导入ctypes模块
  libc = cdll.LoadLibrary("libc.so.6") #加载libc动态库
  str = c_char_p(' Hello World! ') #使用char *在ctypes中的对应封装c_char_p,相当于char* str=”Hello World!”
  libc.printf(“yell: %s\n”, str ) #调用printf函数
  ctypes的功能当然远不止这些,有兴趣的同学可以参考这里 http://docs.python.org/library/ctypes.html
  使用Python 的扩展( Extending )机制
  ctypes很方便地可以调用 C 的动态库,但是对 C++ 编译的动态库,调用起来很困难。这种情况利用 Python 的 Extending 机制就可以解决。 Python 提供了一套完整的框架来使用 C/C++ 编写扩展库,可以很灵活的开发 C++ 扩展模块。这种方法的缺点是工作量比较大,需要为每一个方法编写接口,这里不做详细介绍,可以参考: http://docs.python.org/extending/extending.html#writing-extensions-in-c
  那么有什么办法可以高效的调用C++ 动态库呢,答案是 SWIG 。
  使用SWIG 生成扩展模块
  上面提到了Python 的扩展机制,缺点是工作量比较大,这里介绍一个工具 SWIG 。 SWIG 是一种简化脚本语言与 C/C++ 接口的开发工具,通过包装和编译 C 语言程序来达到与脚本语言通讯目的的工具。它正是基于 Python 的扩展机制,自动生成接口文件,再编译成可以被 Python 调用的动态库扩展模块。
  使用SWIG 生成扩展模块分为以下几步:
将需要调用的代码编译成目标文件(.o) ;
用SWIG 读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;
将接口文件编译为目标文件(.o) ;
将接口文件的目标文件和原代码段的目标文件一起编译成动态库 ;
假设有如下文件
  swig_ex.cpp 需要转换成扩展库的原始代码,包含一个int fact(int) 函数
  swig_ex.h 原始代码的头文件
  swig_ex.i SWIG描述文件
  swig_ex.i是一个描述文件,有 SWIG 自己的语法,比较简单,内容如下:

%mole swig_ex
%{
#define SWIG_FILE_WITH_INIT
#include "swig_ex.h"
%}
int fact(int n);
  再写一个Makefile 来把这些文件编译成动态库 :

all: swig_ex.o swig_ex_wrap.o _swig_ex.so
swig_ex.o: swig_ex.cpp swig_ex.h #编译源文件
g++ -fPIC -c swig_ex.cpp
swig_ex_wrap.o: swig_ex.i swig_ex.o #根据 SWIG 描述文件 (.i) 生成接口文件 (.cxx) ,再编译之
swig -c++ -python swig_ex.i
g++ -O2 -fPIC -c swig_ex_wrap.cxx -I/home/work/linyi/autoframe/tool/python/include/python2.6/
_swig_ex.so: swig_ex_wrap.o #将目标文件打包成动态库
g++ -shared swig_ex.o swig_ex_wrap.o -o _swig_ex.so
.PHONY: clean
clean:
rm -rf swig_ex_wrap.* swig_ex.py _swig_ex.so
  编译好以后会有一个so 和 py 文件,写一个 setup.py 把他们安装到 python 目录就可以和其他模块一样被 python 调用了:

Import swig_ex
swig_ex.fact(10)
  参考文档地址:http://www.swig.org/Doc1.3/SWIGDocumentation.html
  原始但有效的方法
  除了上面这些方法,在Python 中借用 C/C++ 代码最原始有效的方法就是将代码编译成可执行程序,从 Python 里用 Popen 方法来调用获取输出。这种方法简单有效,缺点是不够灵活,有比较大的局限性,不过在很多情况下也已经足够了。

pipe = os.popen('./tool –a %s –b %s' % (“hello”, “world”))
re = pipe.read()
  其他方法
  以上这些方法基本上已经能满足Python 调用 C/C++ 的需求了,此外还有一些方法,例如使用 Boost.Python ,使用 Pyrex ,这些方法都能提供 Python 与 C/C++ 的交互。
  总结
  在Python 中引用 C/C++ 模块的方法较多,根据需要从中选择恰当的方法可以减少很多工作量。
  在Python 中引用 C/C++ 模块弥补了 Python 脚本测试框架的很多不足,在提高代码复用率的同时,模块的性能也大大提高。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 如何使用cython编译扩展 篮球全场的实用战术详解? 篮球比赛中有哪些著名的战术?拜托各位大神 打篮球有什么战术? 青字加个竹字头什么字 藻类植物属于真核生物还是原核生物? 倩有几种读音? 原核藻类和真核藻类的区别并举例子 各个文字的演变过程? 青田字格怎么写 “静”字为什么是“青”字旁边一个“争”字? 藻类中哪些是原核生物,哪些是真核生物?请列举出常见的例子. 青而且这四个字的发音都从什么而来 藻类中哪些是原核生物,哪些是真核生物?请列举出常见的例子. 如题. 靑属于什么字 青是不是独体字 牛腱子如何烹饪味道好?不要卤和酱的 青春繁体字怎么写 精、青、清是形近字么 青,去掉上面三横,在一竖,下面什么字。谢谢了 5v5篮球赛有哪些简单的进攻战术? 篮球比赛中有多少经典战术?越详细越好!谢谢! cython编译为可执行文件,目标机器上不用安装Python环境就可以执行... cython 需要 c 基础吗 Python 代码例子,怎样编译成.py文件 如何编译C++文件为Python扩展模块 pypy如何把python的py文件编译成c代码? python和cython是什么关系 怎样查看cython是否安装成功 python编译C扩展报错 请问衡量一个国家经济水平主要都有哪些指标? 衡量经济发展状况的主要指标有哪些? 经济增长的衡量指标有哪些 衡量一个国家经济总量指标是什么 衡量经济的指标有哪些?如:恩格尔系数,基尼系数等。 有谁知道下面图片包装的是什么牌子的茶叶,是什么样的茶吗? 什么是最优资本结构? 为什么GDP被认为是衡量一国经济水平的最重要的一个指标? 安溪铁观音茶叶,大家都是怎么包装?用什么样的茶叶包装机? 过了保质期一年的真空小包装的铁观音还能喝吗?