Ошибка двоичного типа SWIG при вводе списка - PullRequest
0 голосов
/ 26 мая 2020

Я получаю ошибку TypeError из двоичного файла SWIG C ++ -> python 3.6. Это простая C оболочка для метода класса, которую я упростил, чтобы исключить все поверхностные STL-вещи.

swig -version
SWIG Version 3.0.12

cmake --version
cmake version 3.15.2

python --version
Python 3.6.9

clang++ --version
clang version 10.0.0 (trunk 375507)

Ошибка:

In [12]: import proto                                                                                                                                              

In [13]: a = [1.1]*10                                                                                                                                               

In [14]: b = [2.0] * 10                                                                                                                                             

In [15]: proto.find_path(10, 5, a, b)                                                                                                                              
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-bec8cb507a9b> in <module>
----> 1 _proto.find_path(10, 5, a, b)

TypeError: in method 'find_path', argument 3 of type 'float []'

Реализация:

python_graph.hpp:

#ifndef __PYTHON_GRAPH_HPP__
#define __PYTHON_GRAPH_HPP__

int* find_path(int, int, float[], float[]);

#endif

python_graph. cpp

#include "python_graph.hpp"
#include "graph.hpp"

int* find_path(int n, int T, float a[], float b[]) {

  auto pg = PartitionGraph(n, T, a, b);
  return pg.get_optimal_path_extern();

}

proto.i:

/* File : proto.i */
%module proto

%{
#include "python_graph.hpp"
#include "graph.hpp"
%}

%include "python_graph.hpp"

Я строю с помощью cmake:

cmake_minimum_required(VERSION 3.6)

project(proto)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(GNUInstallDirs)

find_package(SWIG REQUIRED)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs REQUIRED)

include(UseSWIG)
# set(UseSWIG TARGET_NAME_PREFERENCE STANDARD)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

set(CMAKE_SWIG_FLAGS "")

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${PYTHON_INCLUDE_PATH})

add_library(graph OBJECT graph.cpp)

# C++ executable
add_executable(proto main.cpp)
target_link_libraries(proto graph)

# SWIG bindings
set_source_files_properties(proto.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(proto.i PROPERTIES SWIG_FLAGS "-includeall")
swig_add_library(proto LANGUAGE python SOURCES python_graph.cpp graph.cpp proto.i)
swig_link_libraries(proto ${PYTHON_LIBRARIES})

Сборка cmake также создает автономный рабочий исполняемый файл C ++, возникает проблема при обертывании SWIG. Я пробовал кучу вещей, я не уверен, что ожидает SWIG, ничего не могу найти в документации. Спасибо.

1 Ответ

0 голосов
/ 27 мая 2020

Разобрался. Кажется, что проще работать с контейнерами stl напрямую, просто измените сигнатуру функции и приведенный выше интерфейсный файл на

/* File : proto.i */
%module proto

%{
#include "graph.hpp"
#include "python_graph.hpp"
%}

%include "std_vector.i"
namespace std {
%template(IArray) vector<int>;
%template(FArray) vector<float>;
}

%include "python_graph.hpp"

, затем список может быть определен в python как

a = proto.FArray()
a = [1.4]*10

и c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...