Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import tensorflow as tf
- class PyInterface(object):
- def __init__(self):
- self.X = None
- self.Y = None
- def generate_np_uint8(self):
- np_array = np.random.randint(low=0, high=255, size=(2,2,2),dtype=np.uint8);
- print("Python, uint8:", np_array)
- return np_array
- def generate_np_float32(self):
- np_array = np.random.rand(2,2,2).astype(np.float32)
- print("Python, float:", np_array)
- return np_array
- if __name__ == '__main__':
- py = PyInterface();
- py.generate_np_uint8();
- py.generate_np_float32();
- public:
- float * CppPythonHandler::get_float() {
- return generate_np_float32();
- }
- private:
- float * CppPythonHandler::generate_np_float32() {
- const int ND{3};
- float *c_out = new float[8];
- PyArrayObject *np_ret;
- PyObject* np_array = PyObject_CallMethod(interface, (const char*)"generate_np_float32", NULL, NULL);
- if (np_array) {
- np_ret = reinterpret_cast<PyArrayObject*>(np_array);
- if (PyArray_NDIM(np_ret) != ND) {
- std::cout << "Function returned with wrong dimension" << std::endl;
- Py_DECREF(np_array);
- Py_DECREF(np_ret);
- return c_out;
- }
- c_out[0] = *((float *)PyArray_GETPTR3(np_ret, 0, 0, 0));
- c_out[1] = *((float *)PyArray_GETPTR3(np_ret, 0, 0, 1));
- c_out[2] = *((float *)PyArray_GETPTR3(np_ret, 0, 1, 0));
- c_out[3] = *((float *)PyArray_GETPTR3(np_ret, 0, 1, 1));
- c_out[4] = *((float *)PyArray_GETPTR3(np_ret, 1, 0, 0));
- c_out[5] = *((float *)PyArray_GETPTR3(np_ret, 1, 0, 1));
- c_out[6] = *((float *)PyArray_GETPTR3(np_ret, 1, 1, 0));
- c_out[7] = *((float *)PyArray_GETPTR3(np_ret, 1, 1, 1));
- for (int i = 0; i < 8; ++i) {
- std::cout << c_out[i] << " ";
- }
- std::cout << std::endl;
- Py_DECREF(np_ret);
- Py_DECREF(np_array);
- return c_out;
- }
- else{
- PyErr_Print();
- Py_DECREF(np_array);
- Py_DECREF(np_ret);
- return c_out;
- }
- }
- static int numargs=0;
- static PyObject*
- emb_numargs(PyObject *self, PyObject *args)
- {
- if(!PyArg_ParseTuple(args, ":numargs"))
- return NULL;
- return PyLong_FromLong(numargs);
- }
- static PyMethodDef EmbMethods[] = {
- {"numargs", emb_numargs, METH_VARARGS,
- "Return the number of arguments received by the process."},
- {NULL, NULL, 0, NULL}
- };
- static PyModuleDef EmbModule = {
- PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
- NULL, NULL, NULL, NULL
- };
- static PyObject*
- PyInit_emb(void)
- {
- return PyModule_Create(&EmbModule);
- }
- int main(int argc, char *argv[]) {
- if (argc < 1) {
- fprintf(stderr,"Usage: call pythonfile funcname [args]n");
- return 1;
- }
- numargs = argc;
- PyImport_AppendInittab("emb", &PyInit_emb);
- Py_Initialize(); // initialize python interpreter
- PyRun_SimpleString("import sys");
- PyRun_SimpleString("if not hasattr(sys, 'argv'):n sys.argv=['']");
- PyRun_SimpleString("sys.path.insert(0, "./")");
- PyRun_SimpleString("sys.path.insert(0, "./venv/Lib")");
- PyRun_SimpleString("sys.path.insert(0, "./venv/Lib/site-packages")");
- // instance cpp interface object
- CppPythonHandler * pInter = new CppPythonHandler("main", "PyInterface");
- // unsigned char * np_uint8 = pInter->get_uint8();
- float * np_float = pInter->get_float();
- std::cout<<"End test"<<std::endl;
- // delete []pInter;
- if (Py_FinalizeEx() < 0) {
- std::cout << "Fails to release" << std::endl;
- return 120;
- }
- system("pause");
- return 0;
- }
Add Comment
Please, Sign In to add comment