如何使用 Cython 将 python 函数作为参数传递给 c++ 函数

2023-12-31

这是我的设置: 我有下一个要包装的 C++ 类:

// Foo.h
class Foo
{
public:
  typedef int MyType;
  typedef int ArgType1;
  typedef int ArgType2;
  ...
  typedef MyType (*FooFunction) (ArgType1 a, ArgType2 b);
  ...
  void setFooFunction(FooFunction f);

在 C++ 中使用此类的示例:

#include "Foo.h"
...
int fooFun(int a, int b)
{
  if (a > b) return a;
  else return b;
}
...
int main(int argc, char **argv)
{
  ...
  fooObj->setFooFunction(&fooFun);
  ...
}  

Cython 包装器:

 # .pyx
 cdef extern from "Foo.h":
   cdef cppclass Foo:
     void setFooFunction(int *) except +

 def bar(fooFun):
   ...
   fooobj.setFooFunction(fooFun)
   ...

我希望能够做到这一点:

 # python file
 ...
 def pyfun(x, y):
   return x + y
 ...
 def main():
   bar(pyfun)

我对 Cython 并不完全熟悉,但我已经尝试过一些魔法,但它不起作用:

 # .pyx
 cdef extern from "Foo.h":
   cdef cppclass Foo:
     void setFooFunction(int *) except +

 ctypedef int (*myFun) (int, int)

 def bar(fooFun):
   cdef myFun funpointer
   funpointer = (<myFun*><size_t>id(smoothfun))[0]
   ...
   fooobj.setFooFunction(<int*>fooFun)
   ...

甚至可以做这样的事情吗?


你不能轻易做到:C++ 函数指针仅存储内存中该函数代码开始的位置(或类似的、特定于实现的内容),而 Python 函数是一个完整的 Python 对象,带有存储字节码的字典(可能是未编译的 Python 代码)、文档字符串和其他一些位。它也不是机器可以独立运行的形式——它需要 Python 解释器来处理字节码。实际上没有办法将所有内容存储在 C++ 函数指针中。

你可以做的是使用 C++11std::function。这可以像函数指针一样使用,并且可以采用任何可调用对象(任何定义operator())。这个想法是你的班级存储一个std::function而不是函数指针。

#include <functional> // for std::function

class Foo {
  private:
    std::function<int(int,int)> stored_function;

  public:
    void setFooFunction(std::function<int(int,int)> f) {
      stored_function = f;
    }

    void doSomething() {
      // call it like this
      int result = stored_function(1,2);
    }
};

然后你通过setFooFunction一个 C++ 类,存储 PyObject*(Python 函数),并定义operator()来调用Python。

如果您不想自己编写 C++ 类,boost::python::object class (http://www.boost.org/doc/libs/1_58_0/libs/python/doc/v2/object.html#object_operators-spec http://www.boost.org/doc/libs/1_58_0/libs/python/doc/v2/object.html#object_operators-spec)具有您需要的功能。您可以轻松地从 Cython 获取 PyObject*

from cpython.ref cimport PyObject
cdef PyObject* pyob_ptr = <PyObject*>some_function

将其转换为 boost c++ 类也很简单(http://www.boost.org/doc/libs/1_58_0/libs/python/doc/tutorial/doc/html/python/object.html#python.creating_python_object http://www.boost.org/doc/libs/1_58_0/libs/python/doc/tutorial/doc/html/python/object.html#python.creating_python_object)

boost::python::object o(boost::python::handle<>(boost::python::borrowed(pyobj_ptr)));

Since o是可调用的,你应该可以直接在std::function

Foo foo; // a foo object
foo.setFooFunction(o); // pass it the boost::python::object

(显然这里缺少很多细节,但希望广泛的方法会有用!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Cython 将 python 函数作为参数传递给 c++ 函数 的相关文章

  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • Pygame 旋转射击

    我和几个朋友一直在编写一种有趣的新射击机制 为了让它发挥作用 我们需要朝玩家面对的方向射击 Sprite 正在使用 Pygame Transform Rotate 进行旋转 我们怎样才能找到一个角度 然后朝那个方向发射子弹呢 这是我们的精灵
  • 为什么Boost在“程序选项”中使用全局函数覆盖来实现自定义验证器

    这个例子 http www boost org doc libs 1 55 0 doc html program options howto html idp163429032显示一个名为validate在全局范围内定义重载函数boost
  • ModuleNotFoundError:没有名为“googleapiclient”的模块

    如果这是一个愚蠢的问题 我深表歉意 我在 stackoverflow 上搜索过 但没有找到解决办法 我正在致力于从 Python 2 7 迁移到 Python 3 8 我收到一个程序的以下错误 请帮我 Traceback most rece
  • NLTK 无法找到 stanford-postagger.jar!设置CLASSPATH环境变量

    我正在开发一个项目 需要我使用 nltk 和 python 来标记令牌 所以我想用这个 但遇到了一些问题 我浏览了很多其他已经提出的问题和其他论坛 但我仍然无法解决这个问题 问题是当我尝试执行以下命令时 from nltk tag impo
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • Django populate() 不可重入

    当我尝试在生产环境中加载 Django 应用程序时 我不断收到此消息 我尝试了所有的 stackoverflow 答案 但没有任何解决办法 任何其他想法 我使用的是 Django 1 5 2 和 Apache Traceback most
  • 如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

    我使用 Visual Studio 2017 使用 vcxproj 文件构建 C 桌面项目 我喜欢默认行为 其中输出目录是项目下面的子目录 例如 myproj sln myproj vcxproj x64 myproj release my
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • 使用std::begin()、std::end()将ArrayXd转换为stl向量,

    在我看来我应该能够使用std begin and std end 转换ArrayXd to std vector
  • 将 PySpark RDD 作为新列添加到 pyspark.sql.dataframe

    我有一个 pyspark sql dataframe 其中每一行都是一篇新闻文章 然后我有一个 RDD 来表示每篇文章中包含的单词 我想将单词的 RDD 作为名为 单词 的列添加到我的新文章数据框中 我试过 df withColumn wo
  • 在 kivy 中嵌套小部件

    我正在尝试在 kivy 中制作一个界面 我认为即使在完成教程之后 我仍然不了解自定义小部件以及如何对它们进行层次结构的一些基本知识 我认为我有更多的盒模型 html 思维方式 因此小部件嵌套在本机 GUI 中的方式对我来说仍然有点陌生 一些
  • 使用 Python PuLP 混合整数规划的时间限制

    我一直在使用PuLP http pythonhosted org PuLP 解决我感兴趣的特定混合整数线性规划 MIP 但是 随着问题规模的增长 PuLP 花费的时间太长 我希望能够运行求解器一段时间 并在需要很长时间的情况下提前终止它 并
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数
  • 关闭 IPython Notebook 中的自动保存

    我正在寻找一种方法来关闭 iPython 笔记本中的自动保存 我已经通过 Google Stack Overflow 搜索看到了有关如何打开自动保存的参考资料 但我想要相反的内容 关闭自动保存 如果这是可以永久设置的东西而不是在每个笔记本的
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • python有比较和交换操作吗

    试图找到python是否支持CAS操作 无锁编程 像java中的并发 Python没有这些操作 Java 具有比 Python 更复杂的并发控制 CPython 几乎每个人都使用的典型实现 有一个您需要了解的全局解释器锁 Jython 是
  • Groovy 安全取消引用运算符 (?.) 的最佳 Scala 模仿?

    我想知道 Groovy 的最好的 Scala 模仿是什么安全取消引用运算符 http groovy codehaus org Null Object Pattern 或者至少有一些接近的替代品是 I ve 简要讨论一下 http www c
  • 带/多个条件赋值

    让我们来一个M 10 x 4 x 12 矩阵 作为例子 我以M 4 val 4 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1
  • 访问未定义的子类型时自定义编译错误消息

    我有一些类型 其中每个类型都有相同名称的子类型 struct TypeA typedef int subtype struct TypeB typedef float subtype 以及没有此子类型但在同一上下文中使用的类型 struct
  • 如何以声明方式使用数据绑定参数创建 RouteUrls?

    我正在使用 ASP NET 4 中的新路由功能 Web 表单 而不是 MVC 现在我有一个绑定到数据源的 asp ListView 其中一个属性是ClientID我想用它从 ListView 项目链接到另一个页面 在global asax我
  • 使用 Picasso 和自定义 Transform 对象加载大图像

    从 Android Gallery 使用 startActivityForResult 加载 大 图像 gt 1 5MB 时 我使用 Picasso 遇到内存不足异常 我使用自定义 Target 对象 因为我需要在位图准备就绪时对其进行预处
  • 城市街道的程序生成?

    我读过 L Systems Parish Muller 和 Kelly McCabe 并尝试实施this https stackoverflow com questions 12956334 how is l systems for roa
  • Coldfusion 为某些类添加 id

    目前我有一堆 HTML 存储在一个变量中 我将其输出到看起来有点像这样的页面 p class firstpara some stuff p p class subhead a heading p p class subsubhead a s
  • 处理 Silverlight 单元测试中的依赖对象

    一段时间以来 我一直在使用 NUnit 和 Moq 以及 Silverlight 代码编写单元测试 我一直遇到的一个问题与 DependencyObjects 有关 如果有任何东西是从 DependencyObject 派生的 那么我无法在
  • 理解和调试 `asyncio.TimeoutError from None` 错误

    我遇到了 aiohttp 的问题 出现以下错误 但不确定修复它的最佳方法 Traceback most recent call last File app app services file ingestion utils py line
  • 检查文件是否包含某些内容

    感谢之前的回答 我可以使用以下命令测试文件是否存在 if empty glob filename endif 我现在想检查该文件是否filename包含文本text 如果可能的话 我想仅使用本机 vimscript 来执行此操作 而不是调用
  • 如何覆盖 Firefox 插件中内置的 XPCOM 组件?

    我第一次涉足 Firefox 扩展开发 到目前为止进展顺利 但我遇到了一个问题 我需要做的一件事是覆盖内置的 nsIPromptService 并用我自己的东西替换它 我在这里完成了基本的 XPCOM 组件创建教程 并让 hello wor
  • 捏合缩放和平移

    我有一个以 LinearLayout 作为主要布局的活动 在该布局中 有一个按钮可将视图 R layout motor block 添加到主布局 R id layout LayoutInflater inflater LayoutInfla
  • 重写句子,同时保留语义

    是否可以使用WordNet http wordnet princeton edu 重写一个句子 使句子的语义仍然相同 或大部分相同 假设我有这样一句话 Obama met with Putin last week 是否可以使用 WordNe
  • malloc()/free() 的对齐限制

    较旧的 K R 第二版 和我读过的其他 C 语言文本讨论了动态内存分配器的实现 其风格为malloc and free 通常还会顺便提及一些有关数据类型对齐限制的内容 显然 某些计算机硬件架构 CPU 寄存器和内存访问 限制了存储和寻址某些
  • 如何通过 Chrome 内容脚本下载文件?

    This 所以答案 https stackoverflow com a 24162238 1830334详细介绍了如何通过 Chrome 扩展程序下载文件 但我使用的是内容脚本 对 Chrome API 的访问受到限制 https deve
  • 使用 C# 删除项目时自动计算列表视图中项目的总价值

    我使用列表视图作为购物车 我需要知道当我删除商品时如何重新计算购物车的总价值 这是我添加到列表视图的代码 private void btnACart Click object sender EventArgs e int value 0 f
  • 从日期时间转换为 INT

    在我的 SSIS 包中 我必须将值从 DateTime 转换为相应的 INTEGER 值 已提供以下示例 关于如何转换这些有什么想法吗 DATETIME INT 1 1 2009 39814 2 1 2009 39845 3 1 2009
  • Visual Studio Community 2015 中的空白应用程序 (XAML) 等效项

    我正在阅读 Head First C 第 3 版 文本 其中包含特定于 VS 2012 的说明 但在 VS Community 2015 中找不到等效内容 文本显示使用 Windows Store gt Blank App XAML 开始一
  • 如何使用 Cython 将 python 函数作为参数传递给 c++ 函数

    这是我的设置 我有下一个要包装的 C 类 Foo h class Foo public typedef int MyType typedef int ArgType1 typedef int ArgType2 typedef MyType