Я получаю ошибку 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, ничего не могу найти в документации. Спасибо.