Python与C/C++ 模块相互调用

From: http://hi.baidu.com/jintuguo/item/45639b4e7cda3c9f833ae1bb

Python调用C动态链接库
Python调用C库很简单,不经过任何封装打包成so,再使用python的ctypes调用即可。
<test.cpp 生成动态库的源文件>

#include <stdio.h>   

extern "C" {  

        void display() {  

                printf("This is Display Function\n");   

        }  

}  

g++ test.cpp -fPIC -shared -o libtest.so  

<call.py 调用动态库的源文件>

import ctypes  

so = ctypes.CDLL("./libtest.so")  

so.display()  

这里需要注意的是:使用g++编译生成动态库的代码中的函数 或者 方法时, 需要 使用extern "C"来进行编译

Python调用C++(含类,重载)动态链接库
但是调用C++的so就有点麻烦了,网上找了下,大部分都是需要extern "C" 来辅助,也就是说还是只能调用C函数 不能直接调用方法 但是能解析C++方法。
<test.cpp 生成动态库的源文件>

#include <Akita/Akita.h>   

class TestLib{  

        public:  

                void display();  

                void display(int a);  

  

  

};  

void TestLib::display() {  

        cout<<"First display"<<endl;  

}  

  

  

void TestLib::display(int a) {  

        cout<<"Second display"<<endl;  

}  

extern "C" {  

        TestLib obj;  

        void display() {  

               obj.display();   

        }  

        void display_int() {  

               obj.display(2);   

        }  

}  

g++ test.cpp -fPIC -shared -o libtest.so
使用这种方法有点麻烦 但是可以解决问题。注意到后面还是会有个extern "C" 不然构建后的动态链接库没有这些函数的符号表的。

<call.py 调用动态库的源文件>

import ctypes  

so = ctypes.CDLL("./libtest.so")  

so.display()  

so.display_int(1)  

运行结果如下:

^[root@:~/Projects/nugget/kvDB-py]#python call.py   

First display  

Second display  

C/C++调用Python模块

<test.cpp >

#include <Akita/Akita.h>   

#include <Python.h>   

int main() {    

        Py_Initialize();    

        if (!Py_IsInitialized())  return FALSE;  

        PyRun_SimpleString("import sys");    

        PyRun_SimpleString("sys.path.append('./')");    

  

        //import Module   

        PyObject* pModule = PyImport_ImportModule("hello");    

        if (!pModule) {    

                cout<<"Can't import Module!/n"<<endl;    

                return -1;    

        }    

  

        PyObject* pDict = PyModule_GetDict(pModule);    

        if (!pDict) {    

                return -1;    

        }    

  

        //fetch Function   

        PyObject* pFunHi = PyDict_GetItemString(pDict, "display");    

        PyObject_CallFunction(pFunHi, "s""Crazybaby");    

        Py_DECREF(pFunHi);    

  

        //Release   

        Py_DECREF(pModule);    

        Py_Finalize();    

        return 0;    

}  

#g++ test.cpp -I/usr/local/include/python2.7 -ldl -lutil -lpthread -lpython2.7


<call.py>

def display(name):  

        print "hi",name  

---------

C++为Python编写扩展模块
Python为C++提供脚本接口。

有了两者交互 方便之极。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 在构造函数中调用super(props)的目的是什么?

[react] 在构造函数中调用super(props)的目的是什么&#xff1f; 这是ES6的语法。class组件继承自React.Component&#xff0c;super(props)之后&#xff0c;有以下几个作用&#xff1a; 初始化props&#xff0c;虽然不进行super(props)操作&#xff0c;组件在实例化时react也…

coverage.py - python 单元测试覆盖率统计工具

前提&#xff1a;1.假定已经安装好coverage.py&#xff08;ubuntu 10.10python.2.7coverage3.5.1&#xff09;2.项目里有模块do.py以及测试它的单元测试模块doTEST.py命令行&#xff1a;$ cd /home/user1/workspace/hp1$ coverage run doTEST.py$ coverage report$ coverage ht…

[react] 为什么建议setState的第一个参数是callback而不是一个对象呢?

[react] 为什么建议setState的第一个参数是callback而不是一个对象呢&#xff1f; React 为了优化性能&#xff0c;有可能会将多个 setState() 调用合并为一次更新。 因为this.props和this.state 可能是异步更新的&#xff0c;你不能依赖他们的值计算下一个state(状态)。以下面…

Python Ctypes结构体指针处理(函数参数,函数返回)

参考网址: http://www.2cto.com/kf/201109/106444.html 本文演示了在python中调用C语言生成的动态库&#xff0c;返回结构体指针&#xff0c;并进行输出&#xff01; test.c(动态库源代码) // 编译生成动态库: gcc -g -fPIC -shared -o libtest.so test.c#include <stdio.h…

[react] react的状态提升是什么?使用场景有哪些

[react] react的状态提升是什么&#xff1f;使用场景有哪些 React的状态提升就是用户对子组件操作&#xff0c;子组件不改变自己的状态&#xff0c;通过自己的props把这个操作改变的数据传递给父组件&#xff0c;改变父组件的状态&#xff0c;从而改变受父组件控制的所有子组件…

exit和return区别

From: http://blog.163.com/liuqiang_mail126/blog/static/109968875201241210473787/ 退出和返回 退出状态(exit status) 函数返回一个被称为退出状态的值. 退出状态可以由return 来指定statement, 否则函数的 退出状态是函数最后一个执行命令的退出状态(0 表示成功,非0 表示…

[react] react中什么是受控组件?

[react] react中什么是受控组件&#xff1f; 表单元素的value/checked值与state绑定&#xff0c;同时表单元素的onChange可以动态的改变对应的state的值&#xff0c;即数据的变更可以更新视图&#xff0c;用户操作视图的更新也可以触发state数据的更新. import React from re…

SQL Server--用户自定义函数

除了使用系统提供的函数外&#xff0c;用户还可以根据需要自定义函数。用户自定义函数是 SQL Server 2000 新增的数据库对象&#xff0c;是 SQL Server 的一大改进。与编程语言中的函数类似&#xff0c;Microsoft SQL Server 用户定义函数是接受参数、执行操作&#xff08;例如…

c语言exit和return区别,在fork和vfork中使用

From: http://www.cnblogs.com/laojie4321/archive/2012/03/31/2426910.html exit函数在头文件stdlib.h中。 exit&#xff08;0&#xff09;&#xff1a;正常运行程序并退出程序&#xff1b; exit&#xff08;1&#xff09;&#xff1a;非正常运行导致退出程序&#xff1b;…

[react] 说说你对“在react中,一切都是组件”的理解

[react] 说说你对“在react中&#xff0c;一切都是组件”的理解 React采用组件化的思想&#xff0c;最小的组件单位就是原生HTML元素&#xff0c;采用JSX的语法声明组件的调用React的虚拟DOM&#xff0c;就是一个大的组件树&#xff0c;从父组件层到子组件&#xff0c;在rende…

DWT算法

C写的DWT算法转载于:https://blog.51cto.com/yerik/764890

gcc 编译选项

From: http://blog.csdn.net/guogeer/article/details/7407508 [html] view plaincopy下列选项控制编译器警告信息: --all-warnings 此开关缺少可用文档 --extra-warnings 此开关缺少可用文档 -W 不建议使用此开关…

[react] react中的key有什么作用?

[react] react中的key有什么作用&#xff1f; react利用key来识别组件&#xff0c;它是一种身份标识标识&#xff0c;就像我们的身份证用来辨识一个人一样。每个key对应一个组件&#xff0c;相同的key react认为是同一个组件&#xff0c;这样后续相同的key对应组件都不会被创建…

【转】ps命令详解

原文地址&#xff1a;http://apps.hi.baidu.com/share/detail/32573968 有 时候系统管理员可能只关心现在系统中运行着哪些程序&#xff0c;而不想知道有哪些进程在运行。由于一个应用程序可能需要启动多个进程。所以在同等情况下&#xff0c;进程的数 量要比程序多的多。为此从…

Amazon S3 设置对象的生命周期Lifecycle

2019独角兽企业重金招聘Python工程师标准>>> 保存在S3上面的文件&#xff0c;有些是长期保存的&#xff0c;而有一些我们却不希望保存太久&#xff0c;过一段时间后就可以删除了。例如备份文件&#xff0c;太旧的就要删除&#xff1b;又或如日志文件&#xff0c;只保…

[react] react非父子组件如何通信?

[react] react非父子组件如何通信&#xff1f; redux context 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

fatal error C1083: 无法打开包括文件:dxtrans.h: No such file or directory

From: http://blog.csdn.net/pkueecser/article/details/7287938 fatal error C1083: 无法打开包括文件:"dxtrans.h": No such file or directory http://blog.waterlin.org/articles/qedit-problem-in-windows-directshow.html 在使用有关 DirectShow 东西的时…

开灯问题---------简单模拟

有n盏灯&#xff0c;编号为1~n,第一个人把所有灯都打开&#xff0c;第2个人按下所有编号为2的倍数的开关&#xff08;这些灯将会被关掉&#xff09;&#xff0c;第三个人按下所有编号为3的倍数的开关&#xff08;其中关掉的灯将被打开&#xff0c;开着的灯将被关闭&#xff09;…

[react] react中遍历时为什么不用索引作为唯一的key值?

[react] react中遍历时为什么不用索引作为唯一的key值&#xff1f; key值的目的在Diff DOM的时候根据render前后的唯一key值快速的对树进行比较&#xff0c;保证key值得唯一性&#xff0c;如在进行中间插入或者最顶上插入时&#xff0c;算法会很明显得知道这是一个插入动作&am…

TortoiseGit + GitHub 快速上手指南

TortoiseGit GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版&#xff0c;它很好的实现了与windows资源管理器的融合&#xff0c;使用界面与TortoiseSVN非常类似。 2. TortoiseGit运行在msysgit(git的windows开源版本)之上&#xff0c;因此&#xff0c;在…