社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

简单的Python调用C++程序

新机器视觉 • 2 月前 • 145 次点击  


Python调用C/C++程序的方法 

最近写BUG的时候遇到python计算很慢的情况,于是调研了一波在python中嵌入C++程序的方法,记录一下,便于查询。

一般来说在python调用C/C++程序主要可以分为3步:

  • 1、编写C/C++实现程序。- 2、将C/C++程序编译成动态库。- 3、在Python中调用编译生成的库。Python在调用C/C++程序时有一些不同,需要注意。


1、Python调用C函数

Python调用C语言程序比较简单,将C语言程序编译好,再使用python中的ctypes模块调用即可。

C语言源文件:called_c.c


//编译命令 gcc -o libpycall.so -shared -fPIC called_c.c
#include
int foo(int a, int b){
printf("a:%d, b:%d.", &a, &b);
return 0;
}

在命令行或者终端输入:


gcc -o libpycall.so -shared -fPIC called_c.c

生成libpycall.so动态库文件,之后就可以在Python中调用foo函数。Python文件:py_call_c.py


import ctypes
dll = ctypes.cdll.LoadLibrary
lib = dll('./libpycall.so') //刚刚生成的库文件的路径
lib.foo(1, 3)

运行py_call_c.py输出为:


a:1, b:3


2、Python调用C++类

由于C++支持函数重载,在g++以C++方式编译时编译器会给函数的名称附加上额外的信息,这样ctypes模块就会找不到g++编译生成的函数。因此,要让g++按照C语言的方式编译才可以找到生成的函数名。让编译器以C语言的方式编译就要在代码中使用extern关键字将代码包裹起来。

C++源文件:cpp_called.cpp


//Python调用c++(类)动态链接库
#include
using namespace std;

class TestLib
{
    public:
        void display();
        void display(int a);
};
void TestLib::display() {
    cout<<"First display"<
}

void TestLib::display(int a) {
    cout<<"Second display:"<
}
extern "C" {
    TestLib obj;
    void display() {
        obj.display();
      }
    void display_int(int a) {
        obj.display(a);
      }
}

在命令行或者终端输入编译命令:


g++ -o libpycallcpp.so -shared -fPIC cpp_called.cpp

编译参数说明 -fPIC:生成位置无关目标代码,适用于动态连接;-L path:表示在path目录中搜索库文件,如-L.表示在当前目录;-I path:表示在path目录中搜索头文件;-o file:制定输出文件为file;-shared:生成一个共享库文件;

生成libpycallcpp.so,在Python中调用。Python文件:py_call_c.py


import ctypes
dll = ctypes.cdll.LoadLibrary
lib = dll('./libpycallcpp.so') //刚刚生成的库文件的路径
lib.display()
lib.display_int(0)

输出为:


First display
Second display:0

OK,基本功能实现,高级调用后期在填坑


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179437
 
145 次点击