gpt4 book ai didi

python - boost.mpi.world Communicator 与 C++ 签名不匹配:boost::mpi::communicator

转载 作者:太空宇宙 更新时间:2023-11-04 13:21:02 28 4
gpt4 key购买 nike

我正在尽力将 C++ 模块链接到 python 绑定(bind)。我正在努力实现 boost mpi 通信。我正在将 boost.mpi.world 对象发送到 C++,它需要一个 boost::mpi::communicator 对象。当我从 python 调用我的 C++ 函数时,它引发了一个不匹配的签名错误。

myModule.myfunc(Communicator, NoneType, NoneType, _ExcInfo) did not match C++ signature:
myfunc(boost::mpi::communicator {lvalue}, char*, char*, boost::python::api::object)

我不明白 - 看起来它们确实是同一个对象,因此应该具有相同的 C++ 签名。

我是否正确使用了 boost mpi?是什么导致了这个问题?

尝试一个可重复的例子

为了重新创建它,我制作了一个 setup.py 文件和一个包含我的函数的 wrapper.cpp 文件:

包装器.cpp:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/numeric.hpp>
#include <boost/mpi.hpp>

#ifdef WINDOWS
#include <windows.h>
#endif

namespace bp = boost::python;
namespace bpn = boost::python::numeric;

int run_mod_mpi(boost::mpi::communicator &_mpi)

{
return 111;
}

#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(myMod)
{
using namespace bpn;

def("run_my_mpi_mod", run_mod_mpi, "run my module with mpi");
}

设置.py:

from setuptools import setup
from setuptools.extension import Extension
import os

include_dirs = ['/nopt/nrel/apps/boost/1.55.0-openmpi-gcc_140415/include']
library_dirs = ['/nopt/nrel/apps/boost/1.55.0-openmpi-gcc_140415/lib']

EXTRA_LIBS = ['gfortran']

sources = ['wrapper.cpp']

external_libs = [
'boost_regex', 'boost_filesystem', 'boost_serialization', 'boost_system',
'boost_signals', 'boost_python']#, 'lapack', 'blas']

external_libs.append('boost_mpi')
os.environ['CC'] = 'mpicxx'


libraries = external_libs + EXTRA_LIBS

myMod = Extension(name='myMod',
sources=sources,
include_dirs=include_dirs,
library_dirs=library_dirs,
libraries=libraries,
language='c++')

setup(name='myMod',
description='a module I made',
py_modules=['dakota', 'test_dakota'],
ext_modules=[myMod],
zip_safe=False,
)

问题:

$ python setup.py build
$ cd build/lib.linux-x86_64-2.7
$ ipython

In [1]: import myMod
In [2]: from boost.mpi import world
In [3]: myMod.run_my_mpi_mod(world)
Out[3]: 111

所以,我误诊了我的问题。

最佳答案

您应该将 **char*, char*** 作为第二个参数,但您却将两个 NoneType 对象放在那里。

关于python - boost.mpi.world Communicator 与 C++ 签名不匹配:boost::mpi::communicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35302123/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com