【问题标题】:Error while calling C DLL function from Python从 Python 调用 C DLL 函数时出错
【发布时间】:2020-01-24 22:13:50
【问题描述】:

我正在尝试执行我的 Python 代码,该代码必须调用一个 C 函数,该函数执行一些计算并将值保存在一个必须可以从 Python 代码访问的指针中。我想这样做是因为我正在构建一个 DLL,并且我想验证 DLL 函数中的代数,因此我想使用 python 代码来验证 DLL。 Python代码

from ctypes import *


if __name__ == '__main__':

    mydll = cdll.LoadLibrary("./dll_simples.dll")
    funcao = mydll.simuser
    funcao.argtypes = c_double,c_double,POINTER(c_double),POINTER(c_double)



    a = 0
    b = 0
    input_1 = (c_double * 1)()
    input_1[0] = 5
    output_1  = (c_double * 1)()
    funcao(a,b,input_1,output_1)

还有我的 DLL

__declspec(dllexport) void simuser(double t, double delt, double* in, double* out)
{



out[0] = 2 * in[0];



}

执行此代码后,我有错误

funcao(a,b,input_1,output_1)

OSError: exception: access violation reading 0x0000000000000018

【问题讨论】:

  • 只是一个疯狂的猜测:你试过funcao(a,b,byref(input_1),byref(output_1))
  • 出于某种原因需要 python 吗?为什么不从 C 进行测试并省去所有 DLL 的麻烦。如果您需要异常等,请使用 C++ 或 C#。

标签: python c dll ctypes


【解决方案1】:

上市[Python 3.Docs]: ctypes - A foreign function library for Python

因此,您希望将数组传递给需要指针的函数。对于这种情况,ctypes.cast 是必需的:

所以,而不是:

funcao(a, b, input_1, output_1)

使用:

funcao(a, b, cast(input_1, POINTER(c_double)), cast(output_1, POINTER(c_double)))

查看现有的 C 代码,它只对 2 个指针使用一个值,在这种情况下您根本不需要数组(但我怀疑这是意图,因为那时输入value 不应该是指针):

# ...

input_1 = c_double(5)
output_1 = c_double(0)

funcao(a, b, byref(input_1), byref(output_1))

一个工作示例:[SO]: Pointer from Python (ctypes) to C to save function output (@CristiFati's answer)

【讨论】:

  • 我在简化代码中尝试了这种方法,只有 1 个参数
  • 我真的不明白你说什么。你到底尝试了什么?成功了吗?
  • 对不起。评论无意中不完整。我想说我已经尝试过你的方法,但没有奏效。所以我简化了代码,以便使用你的方法('cast'函数)只有1个指针数组。但我仍在努力使这段代码运行良好。当我找到它时,我会在这里发布解决方案。
  • 我必须使用数组,因为将来它将是一个数组,它将被发送到一个 C dll,它将计算一些东西并保存在另一个数组中 (output_1)。
  • 对不起,您的回答是正确的。错误在我的 C 代码中。当我有 Py_Initialize();在 DLL 内部没有任何作用。这个 DLL 必须初始化一个 Python 解释器,当我从 C 代码调用 DLL 时它可以正常工作,但是当 Python 代码调用 DLL 时它会出现错误“OSError:异常:访问冲突读取 0x0000000000000025”。
猜你喜欢
  • 2020-02-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多