痛饮、python 和 wchar_t 问题

Posted

技术标签:

【中文标题】痛饮、python 和 wchar_t 问题【英文标题】:swig, python and wchar_t problem 【发布时间】:2011-02-14 18:21:00 【问题描述】:

我是 Python C 绑定 swig 的新手,并且已经尝试解决这个问题一段时间了。我有一个想从 Python 调用的外部 C 库 (Example.c)。我阅读了 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

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

问候,

川林

【问题讨论】:

【参考方案1】:

上次我将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 界面文件中。

【讨论】:

感谢您的信息。由于前一段时间的截止日期,我已经转向 CType。我确信它有效,我很感激你的帮助:) 我正在使用 ubuntu 12.04 并且出现错误:没有声明 wchar_t_to_PyObject,我找不到有关此函数的任何信息或它是什么... @meteor 我怀疑这在 SWIG 2.0 和更新版本的 SWIG 中已经过时了。 我已经用 SWIG v3.0.5 对此进行了测试:如果我省略 Python-to-C 和 C-to-Python 类型映射,保留 %include 和 %fragment 指令,它就可以工作

以上是关于痛饮、python 和 wchar_t 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 openssl/bn.h 将 c++ 痛饮到 python

痛饮错误:未定义的符号

使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?

Python 3.3 C 字符串处理(wchar_t 与 char)

SWIG:对 Java 的 wchar_t 支持

C++数据类型问题,wchar_t和char;size_t