2013 Summer Project Week:Python Embedding
Key Investigators
- GRC: Rui Li, Jim Miller
- Kitware: Jean-Christophe Fillion-Robin
- Isomics: Steve Pieper
Objective
Python embedding library to manage calling python functions from C++. This will eliminate the code duplication in Slicer.
Approach, Plan
Discuss with Jc and Steve regarding how to incorporate into Slicer. Currently it is used as a downloadable library during superbuild, similar to SlicerExecutionModel.
Progress
Eliminate all the compile time warnings and fixed some stylistic issues. The updated code is pushed on to github at https://github.com/grclirui/PythonCppAPI.git and ready to use.
Delivery Mechanism
PythonCppAPI is a stand alone library. To use it within Slicer, similar to SlicerExecutionModel and other external libraries, an External_PythonCppAPI.cmake is needed in SuperBuild. During superbuild, it will be checked out and built as a library. The sample usage of the library is shown in the following code snippet:
// Ok. Now we can create an instance of the interprter itself. PythonCppApiCallFunction pyCppApiCallFunction(argc, argv);
// to check if the python interpreter is available and working, // execute a simple python statement. pyCppApiCallFunction.ExecuteString("print 'hello'");
// execute the script in a file pyCppApiCallFunction.ExecuteFile("hello.py");
// Load the test module into the interpreter pyCppApiCallFunction.ImportModule("test");
ArgMap args; // our argument list that maps string values bool ok;
// Call a simple function, that takes no arguments // and returns nothing args.clear();
pyCppApiCallFunction.CallFunction("simple", args);
// Call a function that takes two long arguments and returns // a long { PythonCppApiVariant ret(0); // value returned by python is stored here args["10"] = PythonLong; args["20"] = PythonLong; ret = pyCppApiCallFunction.CallFunction("multiply", args); std::cout << ret.toLong(&ok, 0) << '\n'; args.clear(); }