首页 > 解决方案 > 从 Python 调用 C++ 代码的现代/2020 年方式

问题描述

我正在尝试从 Python 脚本调用 C++ 函数。从 2010 年到 2015 年,我在 Stackoverflow 上看到了不同的解决方案,但它们都使用复杂的包,并希望有更简单/更新和更复杂的东西。我试图调用的 C++ 函数接受一个双精度变量并返回一个双精度。

double foo(double var1){
    double result = ...
    return result;
}

标签: pythonc++

解决方案


Python 有ctypes包,它允许调用 DLL 或共享库中的函数。将 C++ 项目编译为 Linux 上的共享库 (.so) 或Windows 上的DLL。导出您希望在外部公开的功能。

C++ 支持函数重载,为避免二进制代码中的歧义,在函数名称中添加了附加信息,称为名称修饰。而在 C 中,函数名称不变,为确保名称不变,只需将其放在 extern “C” 块内即可。


演示:在这个虚拟演示中,我们的库有一个函数,接受一个 int 并打印它。

库文件

#include <iostream>

int Function(int num) 
{
    std::cout << "Num = " << num << std::endl;
    return 0;
}

extern "C" {
    int My_Function(int a)
    {
        return Function(a);
    }
}

我们先把它编译成一个共享对象

g++ -fPIC -shared -o libTest.so lib.cpp

现在我们将利用 ctypes 来加载共享对象/dll 和函数。

我的库

import ctypes
import sys
import os 

dir_path = os.path.dirname(os.path.realpath(__file__))
handle = ctypes.CDLL(dir_path + "/libTest.so")     

handle.My_Function.argtypes = [ctypes.c_int] 
  
def My_Function(num):
    return handle.My_Function(num)    

对于我们的测试,我们将调用该函数num = 16

测试.py

from myLib import *

My_Function(16)

预期的结果也是如此。

在此处输入图像描述


推荐阅读