PyBind11:使用指向字符串的指针的构造函数
PyBind11: constructor that uses pointer to string
我成功绑定了这个构造函数
.def(py::init<const int, const int, const string *>())
我的问题是当我必须使用字符串数组时,如果我这样做的话
alph2=['x','y']
z=Dfa(3,2,alph2)
它没有说:
TypeError: __init__(): incompatible constructor arguments. The
following argument types are supported:
gi_gipy.Dfa(arg0: int, arg1: int, arg2: unicode)
所以我不知道如何从 python 传递类似于 const 字符串的内容*
main.cpp:
#include <iostream>
#include <list>
#include "pybind11/pybind11.h"
void Dfa(const int n_state, const std::size_t size, const char* alpha) {
std::cout << "n_state: " << n_state << "\n";
std::cout << "size: " << size << "\n";
std::cout << "alpha: " << alpha << "\n";
}
void dfa_wrapper(int n_state, std::string alpha) {
// Copy the python unicode string
// and make a c++ std::string.
// Modifying this copy won't change
// the original python string.
Dfa(n_state, alpha.size(), alpha.data());
}
PYBIND11_MODULE(_cpp, m) {
m.def("dfa", &dfa_wrapper, "Wrapper of your Dfa::dfa");
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(test_pybind11)
set(CMAKE_CXX_STANDARD 11)
# Find packages.
set(PYTHON_VERSION 3)
find_package( PythonInterp ${PYTHON_VERSION} REQUIRED )
find_package( PythonLibs ${PYTHON_VERSION} REQUIRED )
# Download pybind11
set(pybind11_url https://github.com/pybind/pybind11/archive/stable.zip)
set(downloaded_file ${CMAKE_BINARY_DIR}/pybind11-stable.zip)
file(DOWNLOAD ${pybind11_url} ${downloaded_file})
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${downloaded_file}
SHOW_PROGRESS)
file(REMOVE ${downloaded_file})
set(pybind11_dir ${CMAKE_BINARY_DIR}/pybind11-stable)
add_subdirectory(${pybind11_dir})
include_directories(${pybind11_dir}/include)
# Make python module
pybind11_add_module(_cpp main.cpp)
Python 3 次测试:
>>> import _cpp
>>> _cpp.dfa(1, "xyz")
n_state: 1
size: 3
alpha: xyz
我成功绑定了这个构造函数
.def(py::init<const int, const int, const string *>())
我的问题是当我必须使用字符串数组时,如果我这样做的话
alph2=['x','y']
z=Dfa(3,2,alph2)
它没有说:
TypeError: __init__(): incompatible constructor arguments. The
following argument types are supported:
gi_gipy.Dfa(arg0: int, arg1: int, arg2: unicode)
所以我不知道如何从 python 传递类似于 const 字符串的内容*
main.cpp:
#include <iostream>
#include <list>
#include "pybind11/pybind11.h"
void Dfa(const int n_state, const std::size_t size, const char* alpha) {
std::cout << "n_state: " << n_state << "\n";
std::cout << "size: " << size << "\n";
std::cout << "alpha: " << alpha << "\n";
}
void dfa_wrapper(int n_state, std::string alpha) {
// Copy the python unicode string
// and make a c++ std::string.
// Modifying this copy won't change
// the original python string.
Dfa(n_state, alpha.size(), alpha.data());
}
PYBIND11_MODULE(_cpp, m) {
m.def("dfa", &dfa_wrapper, "Wrapper of your Dfa::dfa");
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(test_pybind11)
set(CMAKE_CXX_STANDARD 11)
# Find packages.
set(PYTHON_VERSION 3)
find_package( PythonInterp ${PYTHON_VERSION} REQUIRED )
find_package( PythonLibs ${PYTHON_VERSION} REQUIRED )
# Download pybind11
set(pybind11_url https://github.com/pybind/pybind11/archive/stable.zip)
set(downloaded_file ${CMAKE_BINARY_DIR}/pybind11-stable.zip)
file(DOWNLOAD ${pybind11_url} ${downloaded_file})
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${downloaded_file}
SHOW_PROGRESS)
file(REMOVE ${downloaded_file})
set(pybind11_dir ${CMAKE_BINARY_DIR}/pybind11-stable)
add_subdirectory(${pybind11_dir})
include_directories(${pybind11_dir}/include)
# Make python module
pybind11_add_module(_cpp main.cpp)
Python 3 次测试:
>>> import _cpp
>>> _cpp.dfa(1, "xyz")
n_state: 1
size: 3
alpha: xyz