Boost Python传递Python列表到C++方法时参数类型不匹配求助
Boost.Python.ArgumentError:Python列表无法匹配C++的boost::python::list签名
运行测试代码时出现以下错误:
Boost.Python.ArgumentError: Python argument types in boost_cpp.test_list() did not match C++ signature: test_list(boost::python::list)
相关代码
C++实现代码
#include <boost/python.hpp> // Test that passing boost::python::list to C++ works. boost::python::list test_list(boost::python::list input_list) { boost::python::ssize_t size = boost::python::len(input_list); boost::python::list output_list; output_list.append(boost::python::object()); // Append Python None type. output_list *= size; double value; for (unsigned int i = 0; i < size; i++) { value = boost::python::extract<double>(input_list[i]); output_list[i] = value; } return output_list; } BOOST_PYTHON_MODULE(boost_cpp) { using namespace boost::python; def("test_list", test_list); }
编译用setup.py
执行命令:python3 setup.py build_ext --inplace
from distutils.core import setup from distutils.extension import Extension # Boost Python test build of C++ extension methods. boost_cpp = Extension( name="boost_cpp", sources=["./boost.cpp"], include_dirs=["/usr/include"], # C++ header files. library_dirs=["/usr/lib"], # C++ libs. libraries=["boost_python39"], extra_compile_args=[ "-shared", "-export-dynamic", ], ) setup( name="boost_cpp", version="0.1", ext_modules=[boost_cpp], )
Python调用代码
import boost_cpp list_0 = [i for i in range(100)] list_1 = boost_cpp.test_list(input_list = list_0)
问题原因与解决方案
这种类型不匹配问题通常由编译配置或库版本兼容问题导致,可按以下步骤排查修复:
修正setup.py编译参数
移除extra_compile_args中的-shared和-export-dynamic,distutils的Extension会自动处理共享库的编译逻辑,多余参数可能干扰Boost Python的类型转换绑定:from distutils.core import setup from distutils.extension import Extension boost_cpp = Extension( name="boost_cpp", sources=["./boost.cpp"], include_dirs=["/usr/include"], library_dirs=["/usr/lib"], libraries=["boost_python39"], ) setup( name="boost_cpp", version="0.1", ext_modules=[boost_cpp], )验证Boost Python库版本兼容性
执行以下命令确认系统中安装的Boost Python库与Python3.9匹配:ls /usr/lib | grep boost_python若输出中无
libboost_python39.so,需安装对应版本的Boost Python库,或重新编译Boost以支持Python3.9。显式声明函数参数(可选)
在C++的模块注册代码中显式指定参数名,确保关键字参数传递时无歧义:BOOST_PYTHON_MODULE(boost_cpp) { using namespace boost::python; def("test_list", test_list, (arg("input_list"))); }重新编译测试
删除旧编译产物后重新编译:rm -rf build boost_cpp*.so python3 setup.py build_ext --inplace再次运行Python测试代码即可正常传递列表。
内容的提问来源于stack exchange,提问作者Romin Ebrahimi
相关产品推荐
相关产品推荐

