我从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期望什么,无法在文档中找到任何东西。谢谢。
想通了。直接使用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
等