列表输入上的SWIG二进制TypeError

问题描述 投票:0回答:1

我从SWIG C ++中收到TypeError-> 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期望什么,无法在文档中找到任何东西。谢谢。

python c++ python-3.x swig
1个回答
0
投票

想通了。直接使用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

© www.soinside.com 2019 - 2024. All rights reserved.