目前我尝试为Python实现一个简单的C++包装器。为此,我使用boostpython/Numpy扩展。我有下面的BASH脚本编译C++代码并运行我的Python脚本:
#!/bin/bash
PYTHON=<PATH-TO-CONDA>/miniconda3/bin/python3.8
BOOSTINCLUDE=<PATH-TO-BOOST>/boost_1_75_0
PYTHONINCLUDE=<PATH-TO-CONDA>/miniconda3/include/python3.8
PYTHONLIB=<PATH-TO-CONDA>/miniconda3/lib/
FUNCTIONNAME=libswap
g++ -fpic -shared -o $FUNCTIONNAME.so hello.cpp -I$PYTHONINCLUDE -I$BOOSTINCLUDE -L$PYTHONLIB -lpython3.8 -L/Users/christian.andriss/Documents/Programming/Libs/boost_1_75_0/stage/lib -lboost_python38 -lboost_numpy38
$PYTHON test.py
<>我的C++代码看起来像这样:#include <iostream>
#include <boost/python/numpy.hpp>
#include <boost/python.hpp>
using namespace std;
namespace bp = boost::python;
namespace np = boost::python::numpy;
void swap(double *array);
void wrap_swap(np::ndarray const & array);
void swap(double *array) {
double tmp = array[0];
array[0] = array[1];
array[1] = tmp;
return;
}
void wrap_swap(np::ndarray const & array){
//swap(reinterpret_cast<double*>(array.get_data()));
std::cout << "Hello, Python!\n";
return;
}
BOOST_PYTHON_MODULE(libswap)
{
Py_Initialize();
np::initialize();
bp::def("swap", wrap_swap);
}
为了避免换行导致问题,我只需在Python调用wrap_swap函数时打印到命令行
我的Python脚本如下所示:
import libswap
import numpy as np
arr = np.array([1.0,2.0])
libswap.swap(arr.astype(np.double))
print(arr)
当我省略Py_Initialize()时,一切都正常。但是,如果将其包括在内,则会出现以下错误:
Error processing line 1 of <PATH-TO-CONDA>/miniconda3/lib/python3.8/site-packages/matplotlib-3.3.4-py3.8-nspkg.pth:
Fatal Python error: init_import_size: Failed to import the site module
Python runtime state: initialized
...
有人知道问题出在哪里吗
目前没有回答
相关问题 更多 >
编程相关推荐