Python ctypes: how to pass NULL as an argument with const char format **

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!

 # Initialize the MATLAB Compiler Runtime global state from ctypes import * libmcr=cdll.mclmcrrt8_1 # Load mclbase library mcr_dll = cdll.LoadLibrary('C:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v81\\bin\\win64\\mclbase.dll') # Pick function we want to use mclInit=mcr_dll.mclInitializeApplication # Set up argument and results types mclInit.argtypes = [POINTER(POINTER(c_char)),c_size_t] # mclInit.argtypes = [POINTER(c_char_p),c_size_t] #different formatting attempt mclInit.restype = c_bool a=None acast=cast(a,POINTER(c_char_p)) acast1=cast(a,POINTER(c_char)) acast2=cast(a,POINTER(POINTER(c_char))) print 'a=' print a print 'acast=' print acast print 'acast1=' print acast1 print '' # Try calling the function with various argument types try: b=mclInit(None,0) except Exception as ex: print ex raw_input("Exception occurred. b=mclInit(None,0) didn't work. Press Enter to continue") print '' try: b=mclInit(byref(acast),0) except Exception as ex: print ex raw_input("b=mclInit(byref(acast),0) didn't work. Press Enter to continue") print '' try: b=mclInit(acast,0) except Exception as ex: print ex raw_input("b=mclInit(acast,0) didn't work. Press Enter to continue") print '' try: b=mclInit(byref(acast1),0) except Exception as ex: print ex raw_input("mclInit(byref(acast1) didn't work. Press Enter to continue") print '' try: b=mclInit(acast1,0) except Exception as ex: print ex raw_input("b=mclInit(acast1,0) didn't work. Press Enter to continue") print '' try: b=mclInit(byref(acast2),0) except Exception as ex: print ex raw_input("mclInit(byref(acast2) didn't work. Press Enter to continue") print '' try: b=mclInit(acast2,0) except Exception as ex: print ex raw_input("b=mclInit(acast2,0) didn't work. Press Enter to continue") print '' raw_input("Reached the end!!!! Press enter to close") 

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 
+6
source share
2 answers

I am sending this in response to a request from @Krcevina. Unfortunately, I had to remove the MCR due to lack of space on my PC, so I could not check it today, but I think that this code should be quite functional and stable. I tried posting it in the comments, but it doesn't seem to allow the use of large snippets of code, so I created this answer. It simply initializes and terminates the MCR and my own DLL. Obviously, you will need to change the pathnames, etc., so that they fit your own business. I did not get to calling the function from the DLL or passing variables to the specified functions, but I hope this will be useful to you.

This is until I got this problem. The new python engine on Matlab R2014b meant that I didn't need to do this further.

 from ctypes import * libmcr=cdll.mclmcrrt8_1 # Just check to make sure its 64bit python I'm using... print "4 for 32bit, 8 for 64bit:" print sizeof(c_voidp) # 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') # Load matrix library matrix_dll = cdll.LoadLibrary('C:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v81\\bin\\win64\\libmx.dll') # Load ClairesTestInterface library claires_dll = cdll.LoadLibrary('ClairesTestCompile.dll') #typedef int (*mclMainFcnType)(int, const char **); mclMainFcnType=CFUNCTYPE(c_int, c_int, POINTER(c_char_p) ) # (returnvalu, arg1, arg2) def run_main(argc,argv): print "run_main entered." # call mclInitializeApplication(NULL,0) mclInitializeApplication = mclbase_dll.mclInitializeApplication mclInitializeApplication.argtypes = [POINTER(c_char_p),c_size_t] mclInitializeApplication.restype = c_bool b = mclInitializeApplication(None,0) print "mclInitializeApplication returned " print b # call mclIsMCRInitialized() mclIsMCRInitialized = mclbase_dll.mclIsMCRInitialized mclIsMCRInitialized.argtypes = None mclIsMCRInitialized.restype = c_bool b = mclIsMCRInitialized() print "mclIsMCRInitialized = " print b # call ClairesTestCompileInitialize() ClairesTestCompileInitialize = claires_dll.ClairesTestCompileInitialize ClairesTestCompileInitialize.argtypes = None ClairesTestCompileInitialize.restype = c_bool b = ClairesTestCompileInitialize() print "ClairesTestCompileInitialize = " print b ## ------------------------------------------------------------------------------------------------------- ## ------------------------------------------------------------------------------------------------------- # call ClairesTestCompileTerminate() ClairesTestCompileTerminate = claires_dll.ClairesTestCompileTerminate ClairesTestCompileTerminate.argtypes = None ClairesTestCompileTerminate.restype = None ClairesTestCompileTerminate() print "ClairesTestCompileTerminate has run " # Call mclTerminateApplication() mclTerminateApplication = mclbase_dll.mclTerminateApplication mclTerminateApplication.argtypes = None mclTerminateApplication.restype = c_bool f = mclTerminateApplication() print "mclTerminateApp returned " print f print "Reached the end of run_main()!!!" return b def main(): print "main() entered." # Call mclmcrInitialize() mclmcrInitialize = mclmcr_dll.mclmcrInitialize mclmcrInitialize.argtypes = None mclmcrInitialize.restypes = c_bool a = mclmcrInitialize() print "mclmcrInitialize returned " print a #LIBMWMCLBASE_API_EXTERN_C int mclRunMain(mclMainFcnType run_main, int argc, const char **argv); mclRunMain=mclbase_dll.mclRunMain mclRunMain.argtypes = [mclMainFcnType, c_int, POINTER(c_char_p)] mclRunMain.restype = c_int try: _run_main = mclMainFcnType(run_main) # reference the callback to keep it alive except Exception as ex: print ex #print "callback referenced to keep it alive." c = mclRunMain(_run_main, 0, None) print "mclRunMain returned " print c raw_input("Reached the end of main()! Press enter to close") main() 
+1
source

As long as we can guess, you can try:

 mclInit.argtypes = [POINTER(c_char_p), c_size_t] a = POINTER(c_char_p)() b = c_size_t(0) ret = mclInit(byref(a), b) 
0
source

Source: https://habr.com/ru/post/978333/


All Articles