当前位置: 首页 > 面试题库 >

使用ctypes从python调用c:传递向量

危卜鹰
2023-03-14
问题内容

我想使用ctypes从python调用ac函数。从文档中,我不了解如何将指针传递给向量。我要调用的函数是:

double f(int n, double* x)
  {
    int i;
    double p=1;
    for (i=0; i< n; i ++) 
      p = p * x[i];
    return p;
  }

我用void指针修改了该函数,因此f(int, void*)内部强制转换为double。我执行以下操作:

def f(x):
  n = len(x)
  libc = '/path/to/lib.so'
  cn = c_int(n)
  px = pointer(x)
  cx = c_void_p(px)
  libc.restype = c_double
  L = libc.f(cn, cx)
  return L

我假设x是一个numpy数组,但是我不确定numpy数组在内存中的组织方式以及这是否是最佳解决方案。

编辑:

提议的方法均不适用于numpy数组,可能是由于我如何定义数组:

x = np.array([], 'float64')
f = open(file,'r')
for line in f:
  x = np.append(x,float(line))

但是如果我有一个明确的列表(例如)[1,2,3,4,5],而不是已经在其他位置定义的列表,则其中一些可以工作x


问题答案:

基于@Sven Marnach的答案:

#!/usr/bin/env python
import ctypes
import numpy as np
from numpy.ctypeslib import ndpointer

libf = ctypes.cdll.LoadLibrary('/path/to/lib.so')
libf.f.restype = ctypes.c_double
libf.f.argtypes = [ctypes.c_int, ndpointer(ctypes.c_double)]

def f(a):
    return libf.f(a.size, np.ascontiguousarray(a, np.float64))

if __name__=="__main__":
    # slice to create non-contiguous array
    a = np.arange(1, 7, dtype=np.float64)[::2]
    assert not a.flags['C_CONTIGUOUS']
    print(a)
    print(np.multiply.reduce(a))
    print(f(a))

输出量

[ 1.  3.  5.]
15.0
15.0

删除np.ascontiguousarray()呼叫会产生错误的结果(6.0在我的机器上)。



 类似资料:
  • 本文向大家介绍Python使用ctypes调用C/C++的方法,包括了Python使用ctypes调用C/C++的方法的使用技巧和注意事项,需要的朋友参考一下 python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, a

  • 我想 用 C 语言编写一个求和列表的函数,名为 sum_list.c 将 文件设为 sum_list.so 它在步骤4中引发错误: ctypes。ArgumentError:参数1::不知道如何转换参数1 当我用c编写一个函数,将两个数字相加时,它可以正常工作。 所以,重点是我不知道怎么把一个list (python对象)传递给c。 sum_list.c python代码 我希望我的 python

  • 我想从java代码调用python并将参数传递给python中的函数。我已经在python中封装了一个函数。但问题是我还在python程序中导入了第三方库skLearning。当我调用测试程序并将值传递给python时,我能够运行代码。但是当我尝试在python代码中使用第三方库,例如skLearning和import时,我得到了以下错误。 我初始化了Python解释器类的对象,然后使用以下命令,

  • 问题内容: 我正在尝试使用Python ctypes访问DLL文件中的函数。提供的功能说明如下。 该函数引用DLL中定义的一些变量类型。接下来介绍这些变量 请注意,在提供的头文件之一中定义了“ pichar”,如下所示: 这似乎很简单,但是出于某种原因对我来说却无法解决。 我的理解如下:我向函数传递了三个变量: 1)一个,实际上是一个。有人告诉我python ctypes本质上不支持枚举,因此我将

  • 问题内容: 构建与C或C ++库的Python绑定的最快方法是什么? (如果这很重要,我正在使用Windows。) 问题答案: Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.

  • 问题内容: 从python模块中,我正在调用 Hello World 可执行文件,该文件仅打印到stdout。我对将输出重定向到python并遇到这个答案很感兴趣,这几乎将我带到了解决方案中。 此答案的关键部分是以下代码段: 我也想恢复重定向之前的标准输出。 问题 上面的函数到底发生了什么? 是什么和做什么? 什么啊 8号线在做什么?() 如何将标准输出存储在对象中? 调用 Hello World

  • 问题内容: 我正在开发Python / ObjC应用程序,需要从ObjC的Python类中调用一些方法。我已经尝试了几种方法,但都没有成功。 如何从Objective-C调用Python方法? 我的Python类正在Interface Builder中实例化。如何从该实例调用方法? 问题答案: 使用PyObjC。 它包含在Leopard及更高版本中。 它甚至可以与iPython一起使用: ` 要从

  • 好吧,所以这是已经问过的问题,但答案似乎没有多大帮助。我能够使用jython和该问题中发布的答案运行python脚本,但我无法传递变量...当我运行程序时,错误说没有像arg1 arg2和arg3这样的变量...我做错了什么? 这是python脚本 现在错误说arg1 arg2和arg3未声明