我正在尽力将C ++模块链接到python绑定。我正在努力实现提升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文件:
wrapper.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");
}
setup.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
所以,我误解了我的问题。
答案 0 :(得分:0)
你应该给**char*, char***
作为第二个参数,但你在那里放了两个NoneType对象。