Строки SWIG, Python и unicode

Ratmil спросил: 13 июня 2018 в 08:09 в: python

Я разрабатываю модуль Python с помощью SWIG и связываясь с определенной библиотекой. У меня есть такая типовая карта, как:

%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, но он терпит неудачу в travis-ci. После удаления b до "Test string" он преуспевает в travis-ci, но не работает в моем pc.In travis-ci. У меня есть: python: 2.7.6, 3.4.3 В моем компьютере: python: 2.7.13, 3.4.8

Любая идея, почему?

1 ответ

Ratmil ответил: 14 июня 2018 в 11:36
решаемая. Спасибо за все подсказки. Это были разные версии swig.