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

晨曦之光 发布于 2012/04/12 15:58
阅读 23K+
收藏 9
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://blog.csdn.net/crazyjixiang/article/details/6773382
加载中
0
loyal
loyal

这个不全啊,C调用python的直接方法当然好弄,稍微麻烦一点点的是

c调用python中类里的方法....多几行代码就搞定.

0
UTTP
UTTP
学习了
0
adamxuan
adamxuan

在windows上报错

h
huoyankz
你的Python估计是64位的,需要安装32位的Python
返回顶部
顶部