使用Windows.d中SWIG包装的函数

2024-05-29 05:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用用SWIG接口导出的.dll共享库中的函数时遇到问题。

Version Info

Python: 2.6.4

Swig: 2.0.4

大图片是:我在Linux下用C++开发了一些代码,用SWIG包了起来。在Linux下,我将C++源编译成了^ {< CD2> }对象,并在Python中使用了^ {CD2}库。

现在,我需要将所有这些函数迁移到windows,windows中.so的等效函数是.dll。因此,我计划将所有C++源代码编译成^ {< CD1}},并通过Python访问它们。

<> P>所以正常的程序是:有C++源-GT;使用SWIG & GT将它们包起来,编译成{{CD1>}-&通过Python访问。

有一个使用SWIG生成的巨大的.cxx源文件,其中包含我开发的所有函数。现在的任务是将这个SWIG生成的文件编译成一个.dll,以便以后可以使用所有函数。然而,cxx文件使用了一些奇怪的方式来包装我的所有函数,我不知道如何使用它们。

函数包装如下。SSEI有一个C++类,叫做^ {CD10>},在包装后,类成为^ {CD8>}文件中的函数,并定义如下:

SWIGINTERN PyObject *_wrap_sdrts_reverse_burst_ff_sptr___deref__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {

PyObject *resultobj = 0;

boost::shared_ptr< sdrts_reverse_burst_ff > *arg1 = (boost::shared_ptr< sdrts_reverse_burst_ff > *) 0 ;

  void *argp1 = 0 ;

  int res1 = 0 ;

  PyObject * obj0 = 0 ;

  sdrts_reverse_burst_ff *result = 0 ;



  if(!PyArg_UnpackTuple(args,(char *)"sdrts_reverse_burst_ff_sptr___deref__",1,1,&obj0)) SWIG_fail;

  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_boost__shared_ptrT_sdrts_reverse_burst_ff_t, 0 |  0 );

  if (!SWIG_IsOK(res1)) {

    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sdrts_reverse_burst_ff_sptr___deref__" "', argument " "1"" of type '" "boost::shared_ptr< sdrts_reverse_burst_ff > *""'"); 

  }

  arg1 = reinterpret_cast< boost::shared_ptr< sdrts_reverse_burst_ff > * >(argp1);

  result = (sdrts_reverse_burst_ff *)(arg1)->operator ->();

  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sdrts_reverse_burst_ff, 0 |  0 );

  return resultobj;

fail:

  return NULL;

}

这还不是全部:在这个.cxx文件的末尾有一个巨大的数组,它包含所有类函数,如下所示:

^{pr2}$

我沿用了我以前使用.dlls的经验,并用一个简单的__declspec(dllexport)头导出了所有函数。在Python中,我还可以调用导出的_wrap_sdrts_reverse_burst_ff_sptr___deref__

import ctypes

_dll_func_list = ctypes.WinDLL("func.dll")

_reverse_burst_ref = _dll_func_list._wrap_sdrts_reverse_burst_ff_sptr___deref__

不过,这是我能接近的最远的距离。例如,当我试图访问该类中的子函数时

_class_ref._wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst(0)

该死的机器告诉我:

'_wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst' cannot be found.

当我尝试直接调用函数并传入如下参数时:

_dll_func_list ._wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst(0)

机器说

WindowsError: exception: access violation reading 0x00000004

有人知道如何使用Python访问SWIG包装的导出函数吗?


Tags: 文件函数swigreversesharedpyobjectdllff
2条回答

除了.cxx文件外,SWIG还生成一个.py文件。一旦在平台上构建了一个DLL(或共享对象),在Python中使用它所需做的就是

import ModuleName

其中ModuleName是您告诉SWIG调用该模块的内容,可以通过.i文件中的%module在调用该模块时从命令行执行。在

在SWIG生成的Python中,有一些代码可以为您处理DLL的加载-不需要使用ctypes或类似的东西。生成的代码与您在SWythPython中尽可能紧密地封装的SHIG接口相匹配,并神奇地将调用关闭到C++侧。在

因此,如果sdrts_reverse_burst_ff是一个自由函数,则可以执行以下操作:

^{pr2}$

您需要确保使用SWIG期望的名称来构建DLL—从Python引发的异常中可以很明显地看出,如果不是这样的话。您可能还希望将它与包含sdrts_reverse_burst_ff()的实现相链接,除非这是一个只包含头的函数。在

因此,最后的简短答案似乎是C++构建应该产生^ {CD1>}(不^ { CD2>}),以便能够在Windows中在Python中导入^ {CD3>}。这与Linux构建不同,在Linux构建中,_my_dll.so

简单地将.dll文件重命名为.pyd就可以了,但最好还是构建它,正如上面的注释所指出的那样。在

相关问题 更多 >

    热门问题