将C++函数导入Python程序

Nic*_*ick 19 c++ python import function

我现在正在试验python函数.我找到了一种方法将python函数导入c/c ++代码,但不是相反.

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

为简单起见,假设c ++函数非常简单:

int square(x)
{
  return x*x;
}
Run Code Online (Sandbox Code Playgroud)

并且编译的程序名为Cprog.

我想我的python脚本是这样的:

import Cprog

print Cprog.square(4)
Run Code Online (Sandbox Code Playgroud)

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

dol*_*lby 26

这是上面简单示例的一个小工作完成.虽然线程已经老了,但我认为为初学者提供一个简单的全面指南是有帮助的,因为我以前也遇到过一些问题.

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

extern "C" int square(int x)
{
  return x*x;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

g++ -shared -c -fPIC function.cpp -o function.o
Run Code Online (Sandbox Code Playgroud)

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

g++ -shared -Wl,-soname,library.so -o library.so function.o
Run Code Online (Sandbox Code Playgroud)

然后运行wrapper.py一个程序应该工作.


kic*_*hik 9

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

import ctypes
print ctypes.windll.cprog.square(4) # windows
print ctypes.CDLL('cprog.so').square(4) # linux
Run Code Online (Sandbox Code Playgroud)


Dae*_*all 5

您需要创建一个包含该函数的 python 模块。主要有以下三种方式:

  1. 使用 Swig - 这会读取您的 c 代码并从中创建一个 python 模块。
  2. 使用 python c api 手工编码。
  3. 使用 Boost::Python(通常是最简单的方法)。

此 pdf涵盖 1 和 2。此页面将告诉您如何使用 Boost::Python。

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

编辑 - Cython也值得一提。