ctypes OSError:异常:stackoverflow,dll太大

问题描述 投票:0回答:1

我有一个从python调用的c-dll。 dll的输出很大,我怀疑这会导致错误

OSError: exception: stack overflow

我很确定问题出在输出的大小(大约是4x25x720的两倍)。减小输出大小(我不想这样做)会使错误消失。

在C#中,我可以通过为调用线程分配更多的内存来解决此问题,即>]

thread = new Thread(() => calculate(ptr_in, ptr_out), 20000000); 

是否可以用ctypes做类似的事情?

这不是这里发布的问题Ctypes: OSError: exception: stack overflow


编辑

考虑问题,我认为问题不在于输出的大小,而是实际dll本身所需的空间。即ctypes_test.c中定义的c_out inner_out。无论如何,问题仍然相同。


在C中,我定义一个测试dll dll_ctypes_test

ctypes_testT.h

#pragma once
#define N_ELEMENTS 1000
#define N_ARRAYS 50

typedef struct
{
    double var_0;
    double var_1;
    double var_2;
    double var_3;
    double var_4;
    double var_5;
    double var_6;
    double var_7;
    double var_8;
    double var_9;
} element;

typedef struct
{
    int n_elements;
    element elements[N_ELEMENTS];
} arr;

typedef struct
{
    int n_arrays;
    arr arrays[N_ARRAYS];
} c_out;

ctypes_test.c

#include "ctypes_testT.h"

__declspec(dllexport) void _stdcall dll_ctypes_test(double in, c_out *out)
{
    c_out inner_out;

    //Some caluclations on inner_out
    //Wrap values of inner arr to out
}

和Python代码

import ctypes

N_ELEMENTS = 1000
N_ARRAYS = 50

class element(ctypes.Structure):
    _fields_ = [('var_0', ctypes.c_double),
                ('var_1', ctypes.c_double),
                ('var_2', ctypes.c_double),
                ('var_3', ctypes.c_double),
                ('var_4', ctypes.c_double),
                ('var_5', ctypes.c_double),
                ('var_6', ctypes.c_double),
                ('var_7', ctypes.c_double),
                ('var_8', ctypes.c_double),
                ('var_9', ctypes.c_double)] 

class arr(ctypes.Structure):
    _fields_ = [('n_elements', ctypes.c_int),
                ('elements', ctypes.POINTER(element) * N_ELEMENTS)] 

class c_out(ctypes.Structure):
    _fields_ = [('n_arrays', ctypes.c_int),
                ('arrays', ctypes.POINTER(arr) * N_ARRAYS)]     

dll = ctypes.CDLL(r'C:\repos\ctypes_test\x64\Debug\ctypes_test.dll')

dll.dll_ctypes_test.argtypes = [ctypes.c_double, ctypes.POINTER(c_out)]  
dll.dll_ctypes_test.restype = None

dll.dll_ctypes_test(5, c_out())

调用Python代码产生

  File "<ipython-input-1-405b7d25ed3e>", line 33, in <module>
    dll.dll_ctypes_test(5, c_out())

OSError: exception: stack overflow

如果我将N_ARRAYS50更改为10。错误消失了。

我有一个从python调用的c-dll。 dll的输出很大,我怀疑这会导致错误OSError:异常:堆栈溢出我很确定问题是输出的大小(...

python ctypes
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.