【问题标题】:Import C++ function into Python program将 C++ 函数导入 Python 程序
【发布时间】:2010-11-22 01:00:05
【问题描述】:

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

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

为简单起见,假设 c++ 函数如下所示:

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

编译后的程序名为Cprog。

我希望我的 python 脚本是这样的:

import Cprog

print Cprog.square(4)

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

【问题讨论】:

  • 你试过 Boost::Python 吗?
  • 不,我没有。但看起来它可能会做我想要的。我正在调查它。非常感谢!有谁知道这样做的不那么复杂的方法(不使用第三轮模块)?

标签: c++ python function import


【解决方案1】:

这是上面简单示例的一点工作完成。虽然帖子老了,但我觉得给初学者一个简单的包罗万象的指南是有帮助的,因为我之前也遇到过一些问题。

function.cpp 内容(使用外部“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 程序应该可以运行。

【讨论】:

  • 试过这个并得到 (WindowsError(126, 'The specified module could not be found'), ) 对于第一个和 ; (WindowsError(193, '%1 is not an valid Win32 application'), ) 用于第二个。有什么帮助吗?
【解决方案2】:

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

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

【讨论】:

  • 我忘了 ctypes,如果它只是你想要公开的几个函数,那肯定是要走的路。
  • 创建 *.so 文件的最佳方法是什么?抱歉,我不是计算机程序员/科学家,我的 g++ 命令通常类似于“g++ Ccode.cpp -o Cfile”。我尝试使用 -shared 作为附加选项以及上面建议的 linux 行,但收到​​错误消息。我认为我没有正确创建 *.so 文件...有什么建议吗?
  • @Nick:这是一个不同的问题,一个已经被问到的问题:stackoverflow.com/questions/3588476/…
【解决方案3】:

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

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

This pdf 涵盖 1 和 2。This page 会告诉你如何使用 Boost::Python。

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

编辑 - Cython 也值得一提。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      有很多不同的方法可以包装 C++ 代码以在 Python 中使用。大多数都列在 Python wiki here

      我发现了一种相当简单的自动化方法是使用py++ 自动生成包装器,然后编译生成的文件。但这更适合大型项目,因为手动包装所有内容不太可行,并且会导致维护噩梦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多