You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:10:59