I am trying to use Python 3.5 interpreter embedded in a C++ program to receive an image from C++, and use it as an input for my trained tensorflow model. First, I convert my image to numpy array and then send it to python. This is my simplified code which works fine (codes adopted from here):
Python code:
def multiply_fun(M):
V = M*2
print(V)
My C++ code that calls the function above:
#include <Python.h>
#include <abstract.h>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <ndarrayobject.h>
#include <vector>
int main()
{
Py_InitializeEx(1);
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* curDir = PyUnicode_FromString(".");
PyList_Append(sysPath, curDir);
Py_DECREF(curDir);
PyObject* python_code = PyImport_ImportModule("python_code");
PyObject* multiply_fun = PyObject_GetAttrString(python_code, "multiply_fun");
Py_XDECREF(python_code);
import_array1(-1);
npy_intp dim[] = { 5, 5 };
std::vector<double> buffer(5*5, 1);
PyObject* array_2d = PyArray_SimpleNewFromData(2, dim, NPY_DOUBLE, &buffer[0]);
PyObject* return_value1 = PyObject_CallFunction(multiply_fun, "O", array_2d);
Py_XDECREF(return_value1);
Py_XDECREF(array_2d);
Py_XDECREF(multiply_fun);
Py_Finalize();
return 0;
}
However, when I want to use most of the python libraries, I get an error. For example, for this python code:
def multiply_fun(M):
from skimage.io import imsave
imsave('test.png', M)
I got this error:
Exception ignored in: <module 'threading' from 'C:\\Users\\Matin\\Anaconda3\\Lib\\threading.py'>
Traceback (most recent call last):
File "C:\Users\Matin\Anaconda3\Lib\threading.py", line 1283, in _shutdown
assert tlock.locked()
SystemError: <built-in method locked of _thread.lock object at 0x0000000002AF4418> returned a result with an error set
By the way, This related discussion couldn't help me.
Thanks for your help.
EDIT 1:
By moving from skimage.io import imsave
to outside of the python function (as @moooeeeep suggested in comments) I get Null in this line:
PyObject* python_code = PyImport_ImportModule("python_code");
It seems the problem is that PyImport_ImportModule
cannot load submodules of some packages when using from package.submodule import function
. It has been explained in Python/C API Reference Manual:
When the name argument contains a dot (when it specifies a submodule of a package), the fromlist argument is set to the list ['*'] so that the return value is the named module rather than the top-level package containing it as would otherwise be the case. (Unfortunately, this has an additional side effect when name in fact specifies a subpackage instead of a submodule: the submodules specified in the package’s all variable are loaded.) Return a new reference to the imported module, or NULL with an exception set on failure. A failing import of a module doesn’t leave the module in sys.modules.
This function always uses absolute imports.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With