python - 如何用 C++ 扩展 Python?

标签 python c++ wrapper swig

我有执行以下操作的 Python 代码:

  1. 从模拟软件中获取优化问题。

  2. 使用多线程 IPOPT 算法解决了这个优化问题。

  3. 将2中得到的结果转换到另一个维度。

  4. 以图形的形式显示结果。

现在我已经用 C++ 编写了一个类来解决优化问题(第 2 点)以提高速度和其他一些原因,它从第 1 点(问题、约束等)获取输出并给出一个输出进一步传递到第 3 点(Python 中的函数)。

如何将从 1 中获取的这些变量传递给 2 中的 C++ 类,然后再传回 3 中的 Python 函数?以下是我正在尝试的:

我使用 SWIG 来生成包装文件。 SWIG 为 2.cpp2.h C++ 文件创建包装器的接口(interface)文件:

/* File: 2.i */
%module t2c_main
%{
#define SWIG_FILE_WITH_INIT
#include "../include/2.h"
%}
%include ../include/2.h

运行 SWIG 后,我得到了一个 Python 文件和一个 cxx 文件。现在我在使用这些文件时遇到了问题;如上所述,我需要传递变量。

最佳答案

传递变量的具体方式显然取决于数据的存储方式。不过,我们假设 t2c_main 模块包含一个方法 addDataPoint(int,int);

接下来你要做的是:

  • 将生成的 cpp 文件与您的 2.cpp 一起编译并链接到动态库中。
  • 如果生成的python文件名为t2c.py,将刚才编译的动态库重命名为_t2c.pyd(注意下划线,其实很重要)。
  • 在你的 python 代码中导入 t2c 模块

你现在应该可以做类似的事情了

t2c.addDataPoint(5,10)

在你的 python 代码中。

关于python - 如何用 C++ 扩展 Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28530879/

相关文章:

java - 单元测试的包装类

c# - ObjectSet 包装器不适用于 linqToEntities 子查询

python - 如何在 Windows 上安装 web.py

python - 如何获取当前用户和其他用户之间的最后一条消息?

C++ 重复调用返回 *this 的成员函数的顺序

c++ - 如何使用 auto 获得 const_iterator?

c++ - 删除未引用的动态内存

python - 在 python 中包装一个函数,提供一个额外的 bool 值

python - python中的neomodel如何在没有数据库名称的情况下连接neo4j db?

python - 为 Django + Celery + RabbitMQ 预订?