文档章节

python调用C++

初雪之音
 初雪之音
发布于 2017/05/18 15:28
字数 261
阅读 134
收藏 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

 

© 著作权归作者所有

共有 人打赏支持
初雪之音
粉丝 47
博文 268
码字总数 150009
作品 0
广州
程序员
私信 提问
Python与C/C++ 模块相互调用

Python调用C动态链接库 Python调用C库很简单,不经过任何封装打包成so,再使用python的ctypes调用即可。 这里需要注意的是:使用g++编译生成动态库的代码中的函数 或者 方法时, 需要 使用exter...

晨曦之光
2012/04/12
22.9K
3
c++和python服务器方案选择

假如是用c/c++和python写个(游戏)服务器,不讨论纯c/c++或纯python情况下。 c/c++和python之间交互是通过socket、模块调用、还是c/c++中内嵌python? 三个方案,哪种方案用的多一点,或者有...

toil
2013/12/04
1K
3
C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0
04/21
0
0
利用Boost::Python实现C++调用python接口

Boost.Python能将C++的结构体暴露给Python使用。但是在运用Boost.Python时,却遇到一个难题, 1、在C++定义一个新的结构体struct A 2、将此结构体暴露给Python解释器 3、如今在工程中生成结构...

Start-up
2012/11/09
0
0
TensorFlow架构与设计:会话生命周期

TensorFlow的系统结构以C API为界,将整个系统分为「前端」和「后端」两个子系统: 前端系统:提供编程模型,负责构造计算图; 后端系统:提供运行时环境,负责执行计算图。 前端系统主要扮演...

刘光聪
2017/03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

127.0.0.1 和 0.0.0.0 地址的区别

1. IP地址分类 1.1 IP地址表示 IP地址由两个部分组成,net-id和host-id,即网络号和主机号。 net-id:表示ip地址所在的网络号。 host-id:表示ip地址所在网络中的某个主机号码。 即: IP-a...

华山猛男
17分钟前
4
0
解决Unknown host 'd29vzk4ow07wi7.cloudfront.net'. You may need to adjust the proxy settings in Gradle.

把 总项目 下的 build.gradle 中的 两个 jcenter() 用 maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’} 代替。...

lanyu96
22分钟前
1
0
基于redis的分布式锁

redisson提供了基于redis的分布式锁实现方式,本文就尝试了下锁的使用方式。Redisson同时还为分布式锁提供了异步执行的相关方法,第二节执行介绍。 一、可重入锁验证 同一个jvm里面同一线程的...

noob_chr
31分钟前
7
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linux-tao
33分钟前
3
0
设计模式“6”大原则!

面向对象设计原则 概述 对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要...

Java干货分享
50分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部