gpt4 book ai didi

python - swig、python 和 wchar_t 问题

转载 作者:行者123 更新时间:2023-11-28 17:53:39 25 4
gpt4 key购买 nike

我是 Python C 绑定(bind) swig 的新手,一段时间以来一直在尝试解决这个问题。我有一个外部 C 库 (Example.c),我想从 Python 调用它。我阅读了 Swig 教程并能够立即生成包装器。现在的问题是,当我调用 API 时,我得到了这个:

>>> import Example
>>> dir(Example)
['Example_CreateConnection', 'trimmed to fit the screen']
>>> Example.Example_CreateConnection("")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'Example_CreateConnection', argument 1 of type 'ExampleChar const *'

它似乎找不到类型ExampleChar。以下是我的 swig 文件:

%module Example
%{
#include "ExampleSDK.h"
%}

%include "ExampleTypes.h"
%include "ExampleSDK.h"

ExampleTypes.h 看起来像这样:

#ifndef ExampleTypes_H
#define ExampleTypes_H

typedef wchar_t ExampleChar;

#endif /* ExampleTypes_H */

ExampleSDK.h 如下所示:

#ifndef ExampleSDK_H
#define ExampleSDK_H

#include "ExampleTypes.h"
void Example_CreateConnection(const ExampleChar *temp);

#endif /* ExampleSDK_H */

以下是被调用以生成包装器的命令行:

swig -python -I. Example.i
gcc -c Example.c -I/Developer/SDKs/MacOSX10.6.sdk/usr/include/
gcc -c Example_wrap.c -I/usr/include/python2.6 -I.
gcc -bundle -flat_namespace -undefined suppress -o _Example.so Example_wrap.o Example.o -L/usr/lib/python2.6/config/ -lpython2.6

这是 Example.c 的样子:

#include "runetype.h" // for Mac wchar_t definition

#include "ExampleSDK.h"

void Example_CreateConnection(const ExampleChar *temp)
{
//do nothing
}

我不确定它有什么问题。我希望有人能够指出我在这里犯的错误。谢谢。

问候,

林川

最佳答案

上次我将 wchat_t 与 SWIG+Python 结合使用时,我最终需要添加如下内容:

%include "pywstrings.swg"
%include "pystrings.swg"
%include "std_string.i"
%include "typemaps.i"

%fragment("SWIG_AsVal_wchar_t", "header", fragment="<wchar.h>") {
SWIGINTERN int SWIG_AsVal_wchar_t(PyObject* p, wchar_t* c) {
return SWIG_OK;
}
}
%fragment("SWIG_From_wchar_t", "header", fragment="<wchar.h>") {
SWIGINTERNINLINE PyObject* SWIG_From_wchar_t(wchar_t c) {
return SWIG_Py_Void();
}
}

// Python -> C
%typemap(in) wchar_t const * {
$1 = PyString_to_wchar_t($input);
}

// C -> Python
%typemap(out) wchar_t * {
$result = wchar_t_to_PyObject($1);
}

在我的 Swig 接口(interface)文件中。

关于python - swig、python 和 wchar_t 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4995764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com