I am trying to initialize the Matlab Runtime compiler executable (MCR) from python using ctypes. My ultimate goal is to use the C DLL created by the Matlab compiler in python, but the first hurdle I need to overcome is to start the MCR and run it.
I am using Python 2.7.8, Matlab 2013a, MCR8.1.
Snipit from mclbase.h to show arguments, etc.
LIBMWMCLBASE_API_EXTERN_C bool mclInitializeApplication(const char** options, size_t count);
C is the equivalent of what I'm trying to do
mclInitializeApplication(NULL,0)
Here are my various attempts to call a function in python. They inevitably occur in TypeErrors or Windows Error 0xE06D7363. I canβt crack it! I am new to python, so there may be something simple that I am missing. Any comments are welcome!
Edit : just adding python throws exceptions
a= None acast= <__main__.LP_c_char_p object at 0x00000000034E68C8> acast1= <ctypes.LP_c_char object at 0x00000000034E6948> [Error -529697949] Windows Error 0xE06D7363 Exception occurred. b=mclInit(None,0) didn't work. Press Enter to continue argument 1: <type 'exceptions.TypeError'>: expected LP_LP_c_char instance instea d of pointer to LP_c_char_p b=mclInit(byref(acast),0) didn't work. Press Enter to continue argument 1: <type 'exceptions.TypeError'>: expected LP_LP_c_char instance instea d of LP_c_char_p b=mclInit(acast,0) didn't work. Press Enter to continue [Error -529697949] Windows Error 0xE06D7363 mclInit(byref(acast1) didn't work. Press Enter to continue [Error -529697949] Windows Error 0xE06D7363 b=mclInit(acast1,0) didn't work. Press Enter to continue argument 1: <type 'exceptions.TypeError'>: expected LP_LP_c_char instance instea d of pointer to LP_LP_c_char mclInit(byref(acast2) didn't work. Press Enter to continue [Error -529697949] Windows Error 0xE06D7363 b=mclInit(acast2,0) didn't work. Press Enter to continue
EDIT 2
It so happened that mclmcrInitialize()
did not call mclmcrInitialize()
, as @eryksun pointed out. Now I can call the functions (hooray!), But the initialization was unsuccessful :( So, some progress, but still need to be done! Here is the code if anyone is using it. I have several calls to mclIsMCRInitialized()
and mclGetLastErrorMessage()
which accumulate information a little, but can provide useful debugging information.
from ctypes import * libmcr=cdll.mclmcrrt8_1 # Load mclmcr library mclmcr_dll = cdll.LoadLibrary('C:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v81\\bin\\win64\\mclmcr.dll') # Load mclbase library mclbase_dll = cdll.LoadLibrary('C:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v81\\bin\\win64\\mclbase.dll') # Call mclmcrInitialize() mclmcrInit = mclmcr_dll.mclmcrInitialize mclmcrInit.argtypes = None mclmcrInit.restypes = c_bool a = mclmcrInit() print "mclmcrInitialize returned " print a # call mclIsMCRInitialized() mclIsMCRInit = mclbase_dll.mclIsMCRInitialized mclIsMCRInit.argtypes = None mclIsMCRInit.restype = c_bool b = mclIsMCRInit() print "mclIsMCRInitialized = " print b # Call mclGetLastErrorMessage() mclGetLastErrMsg = mclbase_dll.mclGetLastErrorMessage mclGetLastErrMsg.argtypes = None mclGetLastErrMsg.restypes = c_char_p err = mclGetLastErrMsg() print "mcl last error returns " print err # call mclInitializeApplication(NULL,0) mclInit = mclbase_dll.mclInitializeApplication mclInit.argtypes = [POINTER(c_char_p),c_size_t] mclInit.restype = c_bool b = mclInit(None,0) print "mclInitializeApplication returned " print b # call mclIsMCRInitialized() mclIsMCRInit = mclbase_dll.mclIsMCRInitialized mclIsMCRInit.argtypes = None mclIsMCRInit.restype = c_bool b = mclIsMCRInit() print "mclIsMCRInitialized = " print b # Call mclGetLastErrorMessage() mclGetLastErrMsg = mclbase_dll.mclGetLastErrorMessage mclGetLastErrMsg.argtypes = None mclGetLastErrMsg.restypes = c_char_p err = mclGetLastErrMsg() print "mcl last error returns " print err # Call mclTerminateApplication() mclTerminate = mclbase_dll.mclTerminateApplication mclTerminate.argtypes = None mclTerminate.restype = c_bool f = mclTerminate() print "mclTerminateApp returned " print f
Here is the output from python:
mclmcrInitialize returned -2147483647 mclIsMCRInitialized = False mcl last error returns 124384774 mclInitializeApplication returned False mclIsMCRInitialized = False mcl last error returns 128050512 mclTerminateApp returned True