使用 SWIG 为 Python 转换 Linux 中的字符串
Converting Strings in Linux using SWIG for Python
我有一个 C++ class 能够以普通 ASCII 或宽格式输出字符串。我想将 Python 中的输出作为字符串。我正在使用 SWIG(版本 3.0.4)并阅读了 SWIG 文档。我正在使用以下类型映射将标准 C 字符串转换为我的 C++ class:
%typemap(out) myNamespace::MyString &
{
$result = PyString_FromString(const char *v);
}
这在 Windows 中使用 VS2010 编译器工作正常,但在 Linux 中不能完全工作。当我在 Linux 下编译 wrap 文件时,出现以下错误:
error: cannot convert ‘std::string*’ to ‘myNamespace::MyString*’ in assignment
所以我尝试在 Linux 接口文件中添加一个额外的类型映射:
%typemap(in) myNamespace::MyString*
{
$result = PyString_FromString(std::string*);
}
但我仍然遇到同样的错误。如果我手动进入包装代码并像这样修复分配:
arg2 = (myNamespace::MyString*) ptr;
然后代码编译就好了。我不明白为什么我的附加类型映射不起作用。任何想法或解决方案将不胜感激。提前致谢。
您的类型映射似乎没有正确使用参数。你应该有这样的东西:
%typemap(out) myNamespace::MyString &
{
$result = PyString_FromString();
}
其中“$1”是第一个参数。参见 SWIG special variables for more information [http://www.swig.org/Doc3.0/Typemaps.html#Typemaps_special_variables]
编辑:
要处理输入类型图,您需要这样的东西:
%typemap(in) myNamespace::MyString*
{
const char* pChars = "";
if(PyString_Check($input))
{
pChars = PyString_AsString($input);
}
= new myNamespace::MyString(pChars);
}
您可以使用以下代码进行更多错误检查和处理 Unicode:
%typemap(in) myNamespace::MyString*
{
const char* pChars = "";
PyObject* pyobj = $input;
if(PyString_Check(pyobj))
{
pChars = PyString_AsString(pyobj);
= new myNamespace::MyString(pChars);
}
else if(PyUnicode_Check(pyobj))
{
PyObject* tmp = PyUnicode_AsUTF8String(pyobj);
pChars = PyString_AsString(tmp);
= new myNamespace::MyString(pChars);
}
else
{
std::string strTemp;
int rrr = SWIG_ConvertPtr(pyobj, (void **) &strTemp, $descriptor(String), 0);
if(!SWIG_IsOK(rrr))
SWIG_exception_fail(SWIG_ArgError(rrr), "Expected a String "
"in method '$symname', argument $argnum of type '$type'");
= new myNamespace::MyString(strTemp);
}
}
我有一个 C++ class 能够以普通 ASCII 或宽格式输出字符串。我想将 Python 中的输出作为字符串。我正在使用 SWIG(版本 3.0.4)并阅读了 SWIG 文档。我正在使用以下类型映射将标准 C 字符串转换为我的 C++ class:
%typemap(out) myNamespace::MyString &
{
$result = PyString_FromString(const char *v);
}
这在 Windows 中使用 VS2010 编译器工作正常,但在 Linux 中不能完全工作。当我在 Linux 下编译 wrap 文件时,出现以下错误:
error: cannot convert ‘std::string*’ to ‘myNamespace::MyString*’ in assignment
所以我尝试在 Linux 接口文件中添加一个额外的类型映射:
%typemap(in) myNamespace::MyString*
{
$result = PyString_FromString(std::string*);
}
但我仍然遇到同样的错误。如果我手动进入包装代码并像这样修复分配:
arg2 = (myNamespace::MyString*) ptr;
然后代码编译就好了。我不明白为什么我的附加类型映射不起作用。任何想法或解决方案将不胜感激。提前致谢。
您的类型映射似乎没有正确使用参数。你应该有这样的东西:
%typemap(out) myNamespace::MyString &
{
$result = PyString_FromString();
}
其中“$1”是第一个参数。参见 SWIG special variables for more information [http://www.swig.org/Doc3.0/Typemaps.html#Typemaps_special_variables]
编辑:
要处理输入类型图,您需要这样的东西:
%typemap(in) myNamespace::MyString*
{
const char* pChars = "";
if(PyString_Check($input))
{
pChars = PyString_AsString($input);
}
= new myNamespace::MyString(pChars);
}
您可以使用以下代码进行更多错误检查和处理 Unicode:
%typemap(in) myNamespace::MyString*
{
const char* pChars = "";
PyObject* pyobj = $input;
if(PyString_Check(pyobj))
{
pChars = PyString_AsString(pyobj);
= new myNamespace::MyString(pChars);
}
else if(PyUnicode_Check(pyobj))
{
PyObject* tmp = PyUnicode_AsUTF8String(pyobj);
pChars = PyString_AsString(tmp);
= new myNamespace::MyString(pChars);
}
else
{
std::string strTemp;
int rrr = SWIG_ConvertPtr(pyobj, (void **) &strTemp, $descriptor(String), 0);
if(!SWIG_IsOK(rrr))
SWIG_exception_fail(SWIG_ArgError(rrr), "Expected a String "
"in method '$symname', argument $argnum of type '$type'");
= new myNamespace::MyString(strTemp);
}
}