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

如何编译C++文件为Python扩展模块

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

我来回答

1个回答

热心网友 时间:2022-04-18 03:52

大概有三种常用方法:
1>使用ctypes模块来调用C写的共享库,比如:
[python] view plain copy print?
#测试ctypes调用linux动态库的能力
from ctypes import *
lib = CDLL("libc.so.6")
printf = lib.printf
printf("Hello World\n")

#查找动态库
from ctypes.util import find_library
print find_library('c')
output = CDLL(find_library("c")).printf
output("测试成功!\n")
但是用它来调用C++写的so就不太合适,因为编译时c++函数名修饰会给你的函数取一个特殊的字符串,你不能在你的python代码里直接使用此函数名,除非你使用的是修饰后的函数名。(在linux下你可以用nm来查看so中的函数名)

2>用C来写python的扩展模块,这个没怎么用过,以后使用时再记录在此。
3>用C++来写python扩展模块:
我是使用Boost.Python来写扩展的,先上工作中的代码片段:

[python] view plain copy print?
#include <boost/python.hpp> //包含boost.python头文件
#include <cstdio>
#include <string>

using namespace boost::python;//引入命令空间

class lshw //定义一个类
{
public:
lshw();
virtual ~lshw();

void scan_device();
string get_xml();

private:
hwNode *computer;
};

lshw::lshw()
{
computer = new hwNode("computer", hw::system);
}

lshw::~lshw()
{
if (computer)
delete computer;
}

void lshw::scan_device()
{
enable("output:numeric");
disable("output:sanitize");
scan_system(*computer);
}

string lshw::get_xml()
{
return computer->asXML();
}

void hello()
{
std::cout << "Hello World!" <<std::endl;
}

BOOST_PYTHON_MODULE(lshw)
{
class_<lshw, boost::noncopyable > ("lshw", "This is a lshw project python extend", init<>())//导出类中的方法
.def("scan_device", &lshw::scan_device)
.def("get_xml", &lshw::get_xml)
;
def("hello",&hello);//导出方法
}
使用boost.python其实结构很简单,你只要写很少的boost.python的代码,你可以把大部分的精力放在C++功能代码上,花很少的精力就可以把它扩展成python的模块。下面是我在Ubuntu11.10上的编译过程:

首先安装boost.python:
sudo apt-get install libboost-python1.46.1
再来编译生成so共享库文件:
g++ -shared -fPIC lshw.cc -o lshw.so -lboost_python
使用:
[python] view plain copy print?
import lshw
hw = lshw.lshw()
lshw.hello()
hw.scan_device()
xml = self.hw.get_xml()
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? Python 代码例子,怎样编译成.py文件 cython 需要 c 基础吗 cython编译为可执行文件,目标机器上不用安装Python环境就可以执行... 篮球比赛中有多少经典战术?越详细越好!谢谢! 5v5篮球赛有哪些简单的进攻战术? 如何编译c文件中调用 cython 如何使用cython编译扩展 篮球全场的实用战术详解? 篮球比赛中有哪些著名的战术?拜托各位大神 打篮球有什么战术? 青字加个竹字头什么字 藻类植物属于真核生物还是原核生物? 倩有几种读音? 原核藻类和真核藻类的区别并举例子 各个文字的演变过程? 青田字格怎么写 “静”字为什么是“青”字旁边一个“争”字? 藻类中哪些是原核生物,哪些是真核生物?请列举出常见的例子. 青而且这四个字的发音都从什么而来 藻类中哪些是原核生物,哪些是真核生物?请列举出常见的例子. 如题. pypy如何把python的py文件编译成c代码? python和cython是什么关系 怎样查看cython是否安装成功 python编译C扩展报错 请问衡量一个国家经济水平主要都有哪些指标? 衡量经济发展状况的主要指标有哪些? 经济增长的衡量指标有哪些 衡量一个国家经济总量指标是什么 衡量经济的指标有哪些?如:恩格尔系数,基尼系数等。 有谁知道下面图片包装的是什么牌子的茶叶,是什么样的茶吗? 什么是最优资本结构? 为什么GDP被认为是衡量一国经济水平的最重要的一个指标? 安溪铁观音茶叶,大家都是怎么包装?用什么样的茶叶包装机? 过了保质期一年的真空小包装的铁观音还能喝吗? 大家都喜欢什么口味的铁观音和茶叶包装? 哪里可以看到青草直播 青草直播是诈骗吗 QQ直播还重播中草比赛吗??今年!! 如何在MySQL中创建用户以及授权 棉花怎么染色?请问自己在家里怎么把棉花染成彩色的?谢谢!!