将C ++函数导入Python程序

时间:2010-11-22 01:00:06

标签: c++ python function import

我正在尝试使用python函数。我找到了一种方法将python函数导入到c / c ++代码中,但不是相反。

我写了一个c ++程序,它有一定的功能。我想将已编译的c ++程序“导入”我的python脚本并调用c ++函数。

为简单起见,请说c ++函数就像:

一样简单
int square(x)
{
  return x*x;
}

,编译的程序名为Cprog。

我希望我的python脚本类似于:

import Cprog

print Cprog.square(4)

这可能吗?我在互联网上搜索无济于事,我希望你们中的一位大师可能会有一个聪明的方式来解决这个问题......

5 个答案:

答案 0 :(得分:24)

以上是一个简单的例子。虽然线程很老,但我觉得为初学者提供一个简单的全面指南是有帮助的,因为我之前也遇到过一些问题。

function.cpp内容(extern" C"用于使ctypes模块可以处理该函数):

extern "C" int square(int x)
{
  return x*x;
}

wrapper.py内容:

import ctypes
print(ctypes.windll.library.square(4)) # windows
print(ctypes.CDLL('./library.so').square(4)) # linux or when mingw used on windows

然后编译function.cpp文件(例如使用mingw):

g++ -shared -c -fPIC function.cpp -o function.o

然后使用以下命令创建共享对象库(注意:并非所有地方都是空白):

g++ -shared -Wl,-soname,library.so -o library.so function.o

然后运行wrapper.py,该程序应该可以工作。

答案 1 :(得分:9)

如果您将程序构建为共享库/ DLL,则可以使用ctypes来调用它。

import ctypes
print ctypes.windll.cprog.square(4) # windows
print ctypes.CDLL('cprog.so').square(4) # linux

答案 2 :(得分:3)

您希望使用C / C ++模块扩展 python。以下Python文档是开始阅读的好地方:http://docs.python.org/extending/extending.html

答案 3 :(得分:3)

你需要在其中创建一个包含该函数的python模块。主要有三种方式:

  1. 使用Swig - 这将读取您的c代码并从中创建一个python模块。
  2. 使用python c api手动编码。
  3. 使用Boost :: Python(通常是最简单的方法)。
  4. This pdf涵盖1和2. This page将告诉您如何使用Boost :: Python。

    你不能(轻松地)使用c / c ++程序中的函数 - 它必须位于静态库中(你也可以链接你的c / c ++程序)。

    编辑 - Cython也值得一提。

答案 4 :(得分:0)

有很多不同的方法来包装要在Python中使用的C ++代码。大多数都列在Python维基here上。

我发现一种简单易用的自动化方法是使用py++自动生成包装器,然后编译生成的文件。但这更适合大型项目,手工包装所有东西并不是很可行,会造成维护噩梦。