- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过 SWIG 和 Python 重用一些旧的 C 代码。现在我很困惑。我得到的错误可以用一个小例子来证明:
bsp.h:
extern void add(int a[], int b[], int c[]);
bsp.c:
#include "bsp.h"
void add(int a[], int b[], int c[])
{
c[0] = a[0] + b[0];
c[1] = a[1] + b[1];
}
bsp.i
%module bsp
%{
#include "bsp.h";
%}
%include "bsp.h";
设置.py:
#!/usr/bin/env python
from distutils.core import setup, Extension
bsp_module = Extension('_bsp',
sources = ['bsp_wrap.c', 'bsp.c']
)
setup(name = 'bsp',
ext_modules = [bsp_module],
py_modules = ["bsp"]
)
示例 Python 文件“pybsp.py”:
import bsp
a = [1, 1]
b = [1, 1]
c = []
bsp.add(a, b, c)
print(c)
我得到了错误:
Traceback (most recent call last):
File "pybsp.py", line 31, in <module>
bsp.add(a, b, c)
TypeError: in method 'add', argument 1 of type 'int []'
现在,我感到困惑的是 SWIG Documentation说:“SWIG 完全支持 C/C++ 指针。此外,SWIG 可以处理不完整的类型信息。”
我也试过添加
%apply int * INPUT { int *a}
%apply int * INPUT { int *b}
%apply int * OUTPUT { int *c}
我的 .i 文件,在这种情况下被推荐,但没有成功。我的猜测是,我必须在 Python 中创建一个类似于对象的指针才能传递,但我不知道它是如何工作的,但我也希望有一种更简单的方法。
非常感谢您的帮助!
P.S.:如您所料,这是我第一次接触 SWIG,因此很遗憾,我无法从看似相似的问题的解决方案中推导出解决方案。
编辑:我发现对于具有给定维度的数组,如上所述,NumPy 似乎是避免手动包装的好选择。给出了基本的例子here.因此,我将函数定义更改为
void add(int* a, int dim_a, int *b, int dim_b, int *c, int dim_c)
现在包装器似乎有机会将 NumPy 数组转换为 C 数组。
i-文件
%module bsp
%{
#define SWIG_FILE_WITH_INIT
#include "bsp.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (int* IN_ARRAY1, int DIM1){(int* a, int dim_a), (int* b, int dim_b)}
%apply (int* ARGOUT_ARRAY1, int DIM1){(int* c, int dim_c)}
%include "bsp.h"
setup.py
#!/usr/bin/env python
from distutils.core import setup, Extension
import numpy
try:
numpy_include = numpy.get_include()
except AttributeError:
numpy_include = numpy.get_numpy_include()
bsp_module = Extension('_bsp',
sources=['bsp_wrap.c', 'bsp.c'],
include_dirs=[numpy_include]
)
setup(name='bsp',
ext_modules=[bsp_module],
py_modules=["_bsp"]
)
最后是 python 脚本,我想在其中使用 int32 来避免来自 NumPy 的类型转换错误(int64 -> int32)
import bsp
import numpy as np
a = np.array([1, 1], dtype=np.int32)
b = np.array([1, 1], dtype=np.int32)
c = np.array([1, 1], dtype=np.int32)
bsp.add(a, b, c)
print(c)
现在我摆脱了以前的错误,但我有一个新错误:
File "pybsp.py", line 10, in <module>
bsp.add(a, b, c)
TypeError: Int dimension expected. 'unknown type' given.
有什么建议吗?
最佳答案
好的,现在我知道了。正如上面编辑中所写,使用 numpy.i 可以很舒服地包装数组。我没有看到的是,ARGOUT 数组不需要数组作为输入,就像在 C 中一样。只需要维度。因此,使用上面的代码,脚本
import bsp
import numpy as np
a = np.array([1, 1], dtype=np.int32)
b = np.array([1, 1], dtype=np.int32)
c = bsp.add(a, b, np.shape(a)[0])
print(c)
给出想要的输出
[2 2]
关于python - SWIG+c+Python : Passing and receiving c arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222455/
如果数据是从另一台计算机(首先)“发送”的,我如何设置我的套接字例程以“发送”(首先)或(切换)“接收”? 谢谢 通用代码: -(void) TcpClient{ char buffer[12
我正在尝试在代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收者)。 实例方法(未绑定(bind)接收者)。 构造函数引用。 使用静态方法引
我正在尝试在我的代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收器)。 实例方法(UnBound 接收器)。 构造函数引用。 使用静态方法
这个问题在这里已经有了答案: X does not implement Y (... method has a pointer receiver) (4 个答案) 关闭 3 年前。 最近在研究Iri
我把这个问题/错误发布到 GIT 官方 channel ,但没有得到任何回应。希望这里有人可以帮助我。 当 receive.denyCurrentBranch 设置为 updateInstead 并且
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
这个问题在这里已经有了答案: What does this Google Play APK publish error message mean? (17 个答案) 关闭 3 年前。 我为我的应用程
我正在寻找一种解决方案来从我的 child “药物”中获取数据,并使用 ID 从“medication_plan”节点接收特定数据并将它们显示在 Recyclerview 中。 数据库结构: 目前我正
我正在构建 DNN 来预测对象是否存在于图像中。我的网络有两个隐藏层,最后一层看起来像这样: # Output layer W_fc2 = weight_variable([2048, 1])
我有一个模拟销售漏斗的 WF4 服务。它的工作原理是从“注册”接听电话开始。之后,有 10 个类似的阶段(每个阶段包含 2 个接收)。在当前阶段验证接收到的数据之前,您不能前进到一个阶段。但我不确定的
我有一个用 NSubstitute 伪造的对象,它有一个被调用两次的方法。我想验证该方法实际上已被调用两次(且仅调用两次)。我浏览了文档和谷歌,但没有运气。任何帮助,将不胜感激。谢谢。 最佳答案 NS
我在 Windows 上使用 D 编写了一个套接字服务器,现在我想将它移植到 Linux 上。这是代码摘要: /* * this.rawsocks - SocketSet * this.serve
我有一个在 AndroidManifest.xml 中定义了 Receiver 的应用程序,它似乎随机地被禁用,这导致应用程序强制关闭,直到重新安装应用程序。在发生这种情况之前,应用可能会在一天、一周
我正在尝试使用 android 注释库通过两种方式进行广播接收器,但 ide 无法识别此代码中的 @Receiver 或 @ReceiverAction import android.content.
我正在试验 Android 的 LiveData .我只是试图将大量通知推送给观察 LiveData 对象的观察者。我让一个线程在后台运行,在一个 while 循环中,我不断地通过 LiveData
当我运行以下代码时: [Test] public async Task Can_Test_Update() { var response = await _controller.UpdateA
查看 header 时,似乎第二台接收邮件的服务器直到最终 header 中报告的送达日期之后才转发它。 在 c9mailgw11.amadis.com,报告的时间是 22:47:49 -0800
我在这里搜索了几个问题都没有得到答案,所以我会根据我的具体情况询问。 真正简单的接收后 Hook ,它只是 curl 到 Redmine 以强制 Redmine 在提交时更新 repo 的 View
我目前正在尝试 Elixir。我对 Ruby 或函数式编程的经验很少,所以我不太熟悉语法。我在读Learn Elixir in Y minutes其中一个例子让我有点困惑。起初,指南显示了 case
我是一名优秀的程序员,十分优秀!