导入PythPython/NoMy时调用SytPoCKAGE错误,从Python调用C++代码

2024-10-04 05:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我尝试为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
...

有人知道问题出在哪里吗


Tags: topathimport脚本includenparrayconda