#python #rust #swig #swig-typemap
Вопрос:
Я работаю над созданием библиотеки на rust, которая, по моему мнению, была бы чрезвычайно полезна на других языках. Я хотел бы предоставить эту функциональность с идиоматическими привязками как можно большему числу языков с минимальными усилиями, которые мне сойдут с рук. Очевидно, что SWIG-отличный выбор для этого проекта.
Я использую фантастический проект под названием safer_ffi для создания интерфейса C для библиотеки rust. Это устраняет большую часть подверженной ошибкам котельной плиты со стороны ржавчины, но также ограничивает мои возможности в отношении того, как именно выглядит интерфейс C. В настоящее время он представляет строки с этим типом C:
typedef struct {
uint8_t * ptr;
size_t len;
} slice_boxed_uint8_t;
Я ни за что на свете не могу установить ptr-элемент структуры, не вызвав ошибку типа в python. Мой файл интерфейса просто:
%module swig_example
%{
/* Includes the header in the wrapper code */
#include "swig_example.h"
%}
%include "stdint.i"
%include "cstring.i"
/* Parse the header file to generate wrappers */
%include "swig_example.h"
и я пытаюсь настроить структуру с помощью следующего python:
def _str_to_slice(input: str) -> slice_boxed_uint8_t:
slice = slice_boxed_uint8_t()
slice.ptr = input
slice.len = len(input)
return slice
что приводит к следующей ошибке «Ошибка типа: в методе ‘slice_boxed_uint8_t_ptr_set’ аргумент 2 типа ‘uint8_t‘». Я перепробовал всевозможные комбинации того, как его вызывать и как создавать привязки. Я просматривал сгенерированный код на языке Си, но пока не обнаружил проблемы. Похоже, он понимает, что этот указатель является символом, но не устанавливает соединение, которое можно использовать в качестве uint8_t*. Возможно, я неправильно понял часть сгенерированного кода на языке Си, я все еще не очень глубоко в этом разбираюсь.
Я сделал все возможное, чтобы включить всю соответствующую информацию, но я знаю, что в этом посте может отсутствовать какой-то важный контекст, поэтому код можно найти здесь. В README.md указывает здесь, чтобы найти все соответствующие файлы, рассуждая о том, как все настроено, и я проверил сгенерированные SWIG файлы c и python. Этот проект-наименьшее подмножество моего первоначального проекта, которое я мог бы упростить для других в устранении неполадок
Огромное спасибо за любую помощь, которую кто-либо может оказать!