VTK/Python Wrapping FAQ: Difference between revisions
Line 53: | Line 53: | ||
You can tell the wrapper to ignore certain files by using this in your CMakeLists.txt: | You can tell the wrapper to ignore certain files by using this in your CMakeLists.txt: | ||
set_source_file_properties( | |||
vtkMyUnwrappableClass.cxx | |||
WRAP_EXCLUDE | WRAP_EXCLUDE | ||
) | |||
For files that you want to be wrapped in python, but that cannot be wrapped in Tcl or Java, you can mark them for "special wrapping": | |||
set_source_file_properties( | |||
vtkMyClassWrappableInPython.cxx | |||
WRAP_EXCLUDE | |||
) | |||
set_source_file_properties( | |||
vtkMyClassWrappableInPython.cxx | |||
WRAP_SPECIAL 1 | |||
) | |||
== Other Topics == | == Other Topics == |
Revision as of 21:01, 11 March 2015
VTK Python Wrapping System
Big Picture
All the automated wrapping code generation relies on the consistent coding style followed in the VTK header files and the use of the convenience macros. Basically, a target language specific parser parses the header file figures out suitable wrapper functions in the desired target language and spits out the wrapper code that is used to generate the wrappings.
Python Versions
Currently (March 2015), VTK is regularly tested with Python 2.5, 2.6, and 2.7, and it should work with all Python 2.x versions. Python 1.x is no longer supported, the wrappers might compile but the examples will definitely not run under Python 1.x.
Python 3 support is planned, but there is no date set. This version of Python has introduced two very significant changes to the Python-C API that will require changes to the VTK wrapper code. Fortunately the Python 3 API is similar enough to the Python 2 API that it will be possible to support both at the same time (just as numpy does). The hardest part will be to make sure that all the tests and examples run under both Python 2 and Python 3, as the Python language itself has changed more significantly than its C API.
Organization
- First look in VTK/Wrapping. Go over the files there. Specifically look at vtkWrapPython.c which actually does the code generation for Python.
- When VTK is built, an executable called vtkWrapPython is built from this.
- vtkWrapPython generates the Python wrappers for each wrappable VTK header and this is built to generate the Python wrapper.
- The wrapper code makes use of Wrapping/Python/vtkPythonUtil.h and several other C and C++ files in Wrapping/Python for various things. Also note that Wrapping/hints is a mechanism for helping the wrapper code with, err, hints to help the wrapping process along. To see what the individual codes represent see Wrapping/vtkParse.y and vtkParse.tab.c
- The VTK module for the vtk Python package is all in Wrapping/Python/vtk.
Documentation
The VTK module for the vtk Python package is all in Wrapping/Python/vtk. Individual classes can be inspected with the python "help()" function, e.g. help(vtk.vtkObject).
C++ that won't be wrapped
Information about what kinds of VTK class methods can or cannot be wrapped is provided by the README_WRAP.txt file in the VTK/Wrapping/Python directory. Recent progress on the wrappers is described on the python wrapper enhancements page.
CMake's role
Big Picture
I think all CMake does is to build the parser and organize the building of the generated code, link it correctly (which can be a bloody pain) etc. I don't think it directly does anything regarding the wrapper generation process. Any useful CMake macros are best gleaned by looking at CMake files (at least thats how I used to do it).
CMake Macros
1. VTK_WRAP_PYTHON3(${NAME}Python KitPython_SRCS "${WRAP_LIST}")
Will wrap the c++ files in WRAP_LIST into python, outputting a list of transformed files into KitPython_SRCS.
2. ADD_LIBRARY(${NAME}PythonD ${KitPython_SRCS} ${Kit_PYTHON_EXTRA_SRCS})
Will take those outputs, and some optional additional ones, and create a library.
3. PYTHON_ADD_MODULE(${NAME}Python ${NAME}PythonInit.cxx)
Will produce a python module that links in the library so that the wrapped code is more easily callable via python.
That is what ParaView's WRAP_PLUGIN_FOR_PYTHON macro does anyway.
Excluding files from being wrapped
You can tell the wrapper to ignore certain files by using this in your CMakeLists.txt:
set_source_file_properties( vtkMyUnwrappableClass.cxx WRAP_EXCLUDE )
For files that you want to be wrapped in python, but that cannot be wrapped in Tcl or Java, you can mark them for "special wrapping":
set_source_file_properties( vtkMyClassWrappableInPython.cxx WRAP_EXCLUDE ) set_source_file_properties( vtkMyClassWrappableInPython.cxx WRAP_SPECIAL 1 )