在Python程序中导入C++函数

33 投票
5 回答
55810 浏览
提问于 2025-04-16 07:25

我现在正在尝试使用Python函数。我找到了一种方法可以把Python函数导入到C/C++代码中,但反过来就没找到。

我写了一个C++程序,里面有一个特定的函数。我想把这个编译好的C++程序“导入”到我的Python脚本中,并调用这个C++函数。

为了简单起见,假设这个C++函数非常简单:

int square(x)
{
  return x*x;
}

而这个编译好的程序叫做Cprog。

我希望我的Python脚本看起来像这样:

import Cprog

print Cprog.square(4)

这可能吗?我在网上搜索过,但没有找到解决办法,希望你们这些高手能给我一些聪明的建议...

5 个回答

5

你需要创建一个包含这个功能的Python模块。主要有三种方法:

  1. 使用Swig - 这个工具可以读取你的C代码,并从中创建一个Python模块。
  2. 手动编写代码,使用Python的C API。
  3. 使用Boost::Python(通常是最简单的方法)。

这个PDF介绍了第一种和第二种方法。这个页面会告诉你如何使用Boost::Python。

你不能(很容易地)直接使用C/C++程序中的函数 - 它必须在一个静态库中(你也可以将你的C/C++程序链接到这个库)。

编辑 - Cython 也值得一提。

11

如果你把你的程序做成一个共享库或者DLL文件,你可以用ctypes来调用它。

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

这里有一个简单示例的完整代码,虽然这个讨论已经有点时间了,但我觉得为初学者提供一个简单明了的指南还是很有帮助的,因为我之前也遇到过一些问题。

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,程序应该就能正常工作了。

撰写回答