【问题标题】:SWIG, Python and unicode stringsSWIG、Python 和 unicode 字符串
【发布时间】:2018-07-07 21:49:04
【问题描述】:

我正在使用 SWIG 开发一个 Python 模块并与某个库链接。 我有一个如下的类型图:

%typemap(in) MyStringType {
    char* buffer = 0;
    size_t size = 0;
    int alloc = SWIG_OLDOBJ;
    int res = SWIG_AsCharPtrAndSize( $input, &buffer, &size, &alloc );
    if (!SWIG_IsOK(res)) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting string");
    }
    $1.p = buffer;
    $1.n = size - 1;
}

我有一些函数以 MyStringType 作为参数:

void myFunc(MyStringType type);

然后,当我创建 python 模块时,我在 python 2.7 中执行以下操作:

myFunc("Test string")

但是,当我尝试使用 Python 3.4 时,我得到以下信息:

 TypeError: in method 'myFunc', expecting string

我可以通过将它添加到 swig 接口文件来解决这个问题:

%begin %{
#define SWIG_PYTHON_STRICT_UNICODE_WCHAR
%}

这解决了问题。但是我仍然需要再添加一个宏,因为其他一些功能需要它。所以,现在是这样的:

%begin %{
#define SWIG_PYTHON_STRICT_BYTE_CHAR
#define SWIG_PYTHON_STRICT_UNICODE_WCHAR
%}

这会让我像这样调用 myFunc:

myFunc(b"Test string")

对于 python 2.7、3.4 和 3.5,在我的电脑中使用 tox 时一切正常,但在 travis-ci 中失败。 在“测试字符串”之前删除 b 后,它在 travis-ci 中成功,但在我的电脑中失败。 在 travis-ci 中我有: python: 2.7.6, 3.4.3 在我的电脑中:python:2.7.13、3.4.8

知道为什么吗?

【问题讨论】:

  • 在 travis 中构建失败:myFunc(b"Test string")。在我的电脑中,测试失败:myFunc("Test string")
  • 您是否正在创建 2 个不同的共享对象,每个共享对象都与各自的 python 库链接,一个用于 python 2.7,另一个用于 python 3.4。您收到的错误看起来像是链接到了错误的 python 库。

标签: python travis-ci swig tox


【解决方案1】:

解决了。感谢所有提示。 这是不同的痛饮版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2017-11-19
    • 1970-01-01
    • 2011-11-12
    • 2021-11-03
    • 2011-11-07
    • 2012-04-21
    相关资源
    最近更新 更多