Связывание boost / numpy в c ++ в среде conda - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу написать функцию c ++, возвращающую std :: vector. Эта функция c ++ должна вызываться из файла python с оболочкой, так что std :: vector будет возвращен numpy ndarray в сценарии python. Поэтому я подготовил следующий пример кода

Файл теста. cpp:

#include <boost/python.hpp>
#include <boost/numpy.hpp>
#include <vector>
#include <iostream>


std::vector<float> ReturnArray( unsigned int N ){

    std::vector<float> result;
    for ( int i = 0 ; i < N ; i++ ){
        result.push_back( float( i ) );
    }

    return result;
}


namespace bn = boost::numpy;
bn::ndarray mywrapper( unsigned int N ){

    std::vector<float> v = ReturnArray( N );
    Py_intptr_t shape[1] = { v.size() };
    bn::ndarray result = bn::zeros( 1 , shape , bn::dtype::get_builtin<float>() );
    std::copy( v.begin(), v.end(), reinterpret_cast<float*>( result.get_data() ) );
    return result;

}


void Print( char const * test ){

    std::cout << test << std::endl;
}

void Hello( void ){
    std::cout << "Hello this is working" << std::endl;
}


using namespace boost::python;
BOOST_PYTHON_MODULE( test )
{

   Py_Initialize();
   bn::initialize();
   def( "print" , Print );
   def( "ReturnArray" , mywrapper );
   def( "Hello" , Hello );
}

, а файл python test.py:

#!/usr/bin/env python3



import test
import ctypes
import sys

print( sys.version_info )
print(sys.executable)

test.print( "Hello passing string" )
test.Hello()

x = hello.ReturnArray( 10 )
print( x )

Затем я скомпилирую файл теста. cpp с

g++-6 -o test.so -fPIC -shared test.cpp -std=c++11 -lboost_python -lboost_numpy -I$CONDA_PREFIX/include -I$CONDA_PREFIX/include/python3.6m -I$CONDA_PREFIX/lib/python3.6 -L$CONDA_PREFIX/lib -Wl,-rpath,$CONDA_PREFIX/lib 

Я делаю все это в среде conda. Буст библиотека установлена. Собственный компилятор c ++ - 6 также установлен в среде conda. Если я не использую что-либо из пространства имен numpy, то bn :: работает нормально. Но когда я начинаю включать функции и типы из numpy, я получаю следующую ошибку при запуске test.py

ImportError: неопределенный символ: _ZN5boost6python9converter21object_manager_traitsINS_5numpy7ndarrayEE10get_

If I un все bn :: functions кроме bn :: initialize () я получаю следующую ошибку ImportError: test.so: неопределенный символ: _ZN5boost5numpy10initializeEb

Я также пробовал этот пример без использования Конда вообще. Тогда этот пример работает просто отлично. У меня нет клея, что здесь происходит. Любая помощь очень ценится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...