文档章节

python调用C++

初雪之音
 初雪之音
发布于 2017/05/18 15:28
字数 261
阅读 94
收藏 2

python调用C++例子:

python只能调用C函数,所以对于C++我们需要extern "C"来辅助,先写一个工具类

#include <iostream>
using namespace std;

#ifndef _LIBOFCAL_H
#define _LIBOFCAL_H

class LibOfCal
{
    public:
        double add(double, double);
        double sub(double, double);
        double mul(double, double);
        double div(double, double);
};

double LibOfCal::add(double a,  double b) {
    return a + b;
}

double LibOfCal::sub(double a, double b) {
    return a - b;
}

double LibOfCal::mul(double a, double b) {
    return a * b;
}

double LibOfCal::div(double a, double b) {
    return a / b;
}

#endif

接着写一个CPP

/* g++ -o add.so -shared -fPIC add.cpp */
#include <iostream>
using namespace std;

#include "cal.h"

void Init()
{
    cout << "Init: OK" << endl;
}

extern "C" {
    bool testInit()
    {
        Init();
        return true;
    }

    LibOfCal obj;

    double add(double a, double b) {
        return obj.add(a, b);
    }
}

使用如下命令,生成*.so文件

g++ -o add.so -shared -fPIC add.cpp

注意,想要正确调用add函数,还必须在python中声明参数type,

#!/usr/bin/python
#coding=utf-8

import ctypes
from ctypes import c_double
from ctypes import c_bool

ll = ctypes.cdll.LoadLibrary
lib = ll("./add.so")

lib.testInit.restype = c_bool
lib.add.argtypes = [ c_double, c_double ]
lib.add.restype = c_double

print lib.testInit()
print lib.add(0.5, 7.9)

运行结果

$ pycall.py 
Init: OK
True
8.4

ctypes参数列表

Reference

http://www.cnblogs.com/mypsq/p/6114838.html

http://old.sebug.net/paper/books/scipydoc/ctypes_numpy.html

https://docs.python.org/2/library/ctypes.html

 

© 著作权归作者所有

共有 人打赏支持
初雪之音
粉丝 46
博文 268
码字总数 150009
作品 0
广州
程序员
Python调用C/C++初步

测试库要求做到全部自动化--动态添加新的计算图像指标可以直接不用重写底层java程序……这段时间在学Python,由于Python的ctypes可以试python轻松调用动态链接库,从而调用c/c++程序,于是想...

索隆
2012/08/29
0
0
linux下使用 boost.python 调用c++动态库

最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面。测试办法是让 robot framework 通过 SSHLIbrary 库执行远程机器上...

问天小凯
08/01
0
0
使用ffpython嵌入和扩展python

ffpython ffpython is a c++ lib,which is to simplify task that embed python and extend python. For example, call python function, register c++ function to python, register c++ cl......

知然
2013/05/04
0
0
(转)LUA与python根本就不具有可比性

网上经常看到别人拿lua与python来进行对比,但是,本人认为,lua与python根本就不具有可比性.原因如下: 1、两者的定位不同。python的定位在于自身的独立开发,即是说python定位于自己能解决所有...

Yisen
2011/06/27
0
3
如何用 C++ 为 Python 写 dll

如何用 C++ 为 Python 写 dll 来自: http://zhongwei-leg.iteye.com/blog/693519 博客分类: C++ CC#C++PythonOS 1. 先新建一个名为 hello.cpp 的 C++ 源文件: #include <stdio.h> #define......

FreeBlues
2012/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
13
1
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部