这是我第一次在这里发布问题,所以希望我做得正确,否则请告诉我。
我正在尝试使用c ++进行包装,并调用python模块。我可以调用一个简单的python模块,但是,一旦我包含了一个导入模块的python模块,就会出现分段错误。
我将代码导入为使用助手类的地方:
setenv("PYTHONPATH", "./AugmentedAutoencoder/auto_pose/test", 0);
CPyInstance hInstance;
if(!Py_IsInitialized()){
std::cout << "unable to init Py" << std::endl;
}
else{
CPyObject pName = PyUnicode_FromString("aae_webcam");
CPyObject pModule = PyImport_Import(pName);
if(pModule)
{
std::cout << "Module imported.. " << std::endl;
}
else
{
printf("ERROR: Module not imported \n");
PyErr_Print();
}
}
导入的python模块的开头类似于:
import cv2
import argparse
import tensorflow as tf
import numpy as np
import os
import configparser
from auto_pose.ae import factory
from auto_pose.ae import utils as u
from webcam_video_stream import WebcamVideoStream
parser = argparse.ArgumentParser()
parser.add_argument("experiment_name")
arguments = parser.parse_args()
full_name = arguments.experiment_name.split('/')
experiment_name = full_name.pop()
experiment_group = full_name.pop() if len(full_name) > 0 else ''
我尝试在线寻找答案,但是没有成功。因此,我希望您能够向我提供帮助。
编辑: CPyObject是一个类的实例:
class CPyInstance
{
public:
CPyInstance()
{
Py_Initialize();
}
~CPyInstance()
{
Py_Finalize();
}
};
class CPyObject
{
private:
PyObject *p;
public:
CPyObject() : p(NULL)
{}
CPyObject(PyObject* _p) : p(_p)
{}
~CPyObject()
{
Release();
}
PyObject* getObject()
{
return p;
}
PyObject* setObject(PyObject* _p)
{
return (p=_p);
}
PyObject* AddRef()
{
if(p)
{
Py_INCREF(p);
}
return p;
}
void Release()
{
if(p)
{
Py_DECREF(p);
}
p= NULL;
}
PyObject* operator ->()
{
return p;
}
bool is()
{
return p ? true : false;
}
operator PyObject*()
{
return p;
}
PyObject* operator = (PyObject* pp)
{
p = pp;
return p;
}
operator bool()
{
return p ? true : false;
}
};