[Insight-users] ITK in Python

Gaëtan Lehmann gaetan.lehmann at jouy.inra.fr
Fri Oct 6 16:01:30 EDT 2006


Le Sat, 30 Sep 2006 20:44:41 +0200, Zachary Pincus <zpincus at stanford.edu>  
a écrit:

> OK, there's now a "README-MACOSX" file in WrapITK that documents this.

Thanks :-)

Gaetan

>
> Zach
>
> On Sep 30, 2006, at 8:42 AM, Gaëtan Lehmann wrote:
>
>>
>> Hi,
>>
>> Le Sat, 30 Sep 2006 07:45:55 +0200, Zachary Pincus  
>> <zpincus at stanford.edu> a écrit:
>>
>>> Oh dear, this reminds me that I really need to make a README file for  
>>> WrapITK and Mac OS X. I've been terribly behind with all of this due  
>>> to the minor problem of having to write my thesis right now!
>>>
>>> The situation is that there is a bug (sort of) in Python 2.4 and below  
>>> that makes it not interact with the dynamic loader properly on OS X,  
>>> which only manifests when you start passing objects between different  
>>> libraries, and then casting them to different types. And even then,  
>>> only when a recent version of GCC is in use. Apparently, WrapITK is  
>>> the first thing that pressed all of these buttons at the same time.
>>>
>>> The short story is that for WrapITK to work correctly on macs, you'll  
>>> need to get Python 2.5 (or custom-build a patched 2.4 with patches  
>>> that I can point you to). Also, I think (Gaëtan, can you chime in  
>>> here?) that you'll have to build WrapITK with the -fpermissive CPPFLAG  
>>> to deal with some errors that would otherwise arise thanks to some  
>>> low-level changes in Python2.5 that cableswig isn't caught up on.
>>
>> Python 2.5 is out - just install it, and set CMAKE_CXX_FLAGS to - 
>> fpermissive in cmake.
>> You will also have to give the right path for python (python 2.5 is not  
>> managed properly by the stable cmake)
>>
>> On my macbook, I have:
>>
>>  CMAKE_CXX_FLAGS                  -fpermissive
>>  PYTHON_DEBUG_LIBRARY             -framework Python
>>  PYTHON_EXECUTABLE                /Library/Frameworks/ 
>> Python.framework/Versions/Current/bin/python
>>  PYTHON_INCLUDE_PATH              /Library/Frameworks/ 
>> Python.framework/Versions/Current/include/python2.5
>>  PYTHON_LIBRARY                   -framework Python
>>
>>>
>>> I am tremendously sorry that WrapITK is such a pain on the Mac --  
>>> after all, it's what I develop on... please let me know if I can help  
>>> in any other way.
>>
>> nothing really difficult :-)
>> It just lack some documentation
>>
>> Gaetan
>>
>>>
>>> Zach
>>>
>>>
>>>
>>>
>>> On Sep 29, 2006, at 3:51 PM, Erik Anderson wrote:
>>>
>>>> Zach,     I got everything working finally (on Suse 10.1) but a  
>>>> colleague of mine sent me the following error when she tried to run  
>>>> the exact same thing on a Mac:
>>>>
>>>> RuntimeError: /Users/emanuele/code/Insight/Code/Common/ 
>>>> itkImageBase.txx:252:
>>>> itk::ERROR: Image(0x271717b0): itk::ImageBase::CopyInformation()  
>>>> cannot cast PKN3itk10DataObjectE to PKN3itk9ImageBaseILj2EEE
>>>>
>>>> I did a little digging and saw the following post by you a couple  
>>>> years ago:
>>>>
>>>> http://public.kitware.com/pipermail/insight-users/2005-July/ 
>>>> 014144.html
>>>>
>>>> However, I can't find a solution to this.  Do you remember how this  
>>>> was resolved?
>>>>
>>>> Thanks a lot,
>>>> Erik
>>>>
>>>> Zachary Pincus wrote:
>>>>> Strange that it took so long to get everything working properly  
>>>>> together! I'm glad it's working now.
>>>>>
>>>>> Unfortunately, as to getting the input and output types there's no  
>>>>> simple way that I know of. (Perhaps others have some suggestions?)  
>>>>> I'm not sure how the vtk wrappers are set up and the docstrings  
>>>>> created -- maybe we could look into that for WrapITK.
>>>>>
>>>>> Options you might pursue could include:
>>>>> (1) Doing something with doxygen-generated information. Doxygen can,  
>>>>> I think, spit out east-to-parse descriptions of public class  
>>>>> methods. There are hooks in WrapITK to link up doxygen files with  
>>>>> the corresponding WrapITK classes.
>>>>>
>>>>> (2) Parsing through the gcc-xml output that is an intermediate step  
>>>>> in the wrapping. There are python libraries for reading gcc-xml  
>>>>> output, and this should contain all of the information about the  
>>>>> signatures of all of the wrapped methods. This is probably the most  
>>>>> direct method, especially since the xml files are already there in  
>>>>> your build tree.
>>>>>
>>>>> Zach
>>>>>
>>>>>
>>>>> On Sep 25, 2006, at 4:14 PM, Erik Anderson wrote:
>>>>>
>>>>>> Zach,
>>>>>>    I have gotten to the point where itk is working in Python (after  
>>>>>> 2 more rebuilds and a fresh checkout from CVS) but I am running  
>>>>>> into another problem that may or may not be able to be solved.
>>>>>>
>>>>>>    As I mentioned earlier, I'm trying to get at a full description  
>>>>>> of a class.  Currently, I'm able to extract a proper class  
>>>>>> hierarchy, but in order to finish everything, I need to get a  
>>>>>> prototype for the class' methods.  Really, I just need a way to get  
>>>>>> the input and output types for a given class in ITK.  Is this  
>>>>>> possible using any sort of wrapping mechanism?  I know in VTK this  
>>>>>> can be done via vtk.SomeClass.SomeMethod.__doc__
>>>>>>
>>>>>> Thanks again,
>>>>>> Erik
>>>>>>
>>>>>> Zachary Pincus wrote:
>>>>>>> Oh no, I think we're a step backwards.
>>>>>>>
>>>>>>> It looks like now WrapITK can't find any of the configuration  
>>>>>>> information, and happily loads nothing at all into the itk module  
>>>>>>> when imported.
>>>>>>>
>>>>>>> Please send the contents of
>>>>>>> /usr/local/itk/Wrapping/WrapITK/Python/itkConfig.py
>>>>>>> so that we can have a look at it and see where the problem is.
>>>>>>>
>>>>>>> As to your end goal, I think that the itk loading machinery (which  
>>>>>>> I mentioned earlier) already does most of what you need. You'll  
>>>>>>> want to look over itk.py, itkBase.py and itkConfig.py, but  
>>>>>>> basically what happens is that itkBase.py loads all of the  
>>>>>>> configuration files in
>>>>>>> /usr/local/itk/Wrapping/WrapITK/Python/Configuration
>>>>>>> (and potentially elsewhere). These files describe all of the  
>>>>>>> classes in each module, along with the module dependencies, so  
>>>>>>> that we can load them in a sane manner.
>>>>>>>
>>>>>>> This information is stored in itkBase.module_data, which is a  
>>>>>>> dict. The keys are module names, and the values are dicts with two  
>>>>>>> keys: 'depends' (a list of modules that need to be loaded before  
>>>>>>> that module), and 'templates' which is a tuple.
>>>>>>> Each element of 'templates' is itself a tuple containing either  
>>>>>>> three or four elements.
>>>>>>>
>>>>>>> If four, then that element describes a particular template  
>>>>>>> instantiation of a class:
>>>>>>>  (pyClassName, cppClassName, swigClassName, templateParams)
>>>>>>> where 'pyClassName' is the python-friendly name of the class (no  
>>>>>>> enclosing namespace or template params), 'cppClassName' is the  
>>>>>>> fully-qualified name (again less the template params),  
>>>>>>> swigClassName is the name of the exact template instantiation that  
>>>>>>> SWIG generated, and templateParams is the c++ template parameters.  
>>>>>>> This information lets us store all template instances together in  
>>>>>>> a python dict so you can say:
>>>>>>> Image[US, 2]
>>>>>>> as a shortcut for
>>>>>>> itkImageUS2
>>>>>>> which is the SWIG name for
>>>>>>> 'itk::Image<unsigned char, 2>'
>>>>>>>
>>>>>>> If three, then that element describes a non-template instantiation:
>>>>>>> (pyClassName, cppClassName, swigClassName)
>>>>>>> as above.
>>>>>>>
>>>>>>> So you could grab the module_data dict from itkBase and churn  
>>>>>>> through that to get all the information you need. But first you'll  
>>>>>>> need to get the loading working right! So, let's see what's in  
>>>>>>> itkConfig.py and whether that reflects what's going on in your  
>>>>>>> filesystem.
>>>>>>>
>>>>>>> Zach
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Sep 25, 2006, at 1:05 PM, Erik Anderson wrote:
>>>>>>>
>>>>>>>> Zach,
>>>>>>>>    Thanks for the quick reply.  I rebuilt everything and now,  
>>>>>>>> when I perform the following commands:
>>>>>>>> import itk
>>>>>>>> dir(itk)
>>>>>>>>
>>>>>>>> I get something totally different than just a list of the classes  
>>>>>>>> I expect.  Instead, I now get the following:
>>>>>>>>
>>>>>>>> >>> dir(itk)
>>>>>>>> ['B', 'D', 'F', 'LD', 'PyCommand', 'PyImageFilter', 'SC', 'SI',  
>>>>>>>> 'SL', 'SS', 'SmartPointer', 'UC', 'UI', 'UL', 'US',  
>>>>>>>> '_LazyITKModule__lazy_attributes', '__doc__', '__name__',  
>>>>>>>> 'auto_progress', 'class_', 'clrLine', 'ctype', 'echo',  
>>>>>>>> 'force_load', 'image', 'index', 'physical_size', 'pipeline',  
>>>>>>>> 'range', 'show', 'show2D', 'simple_import_callback',  
>>>>>>>> 'simple_progress_callback', 'size', 'spacing', 'strel',  
>>>>>>>> 'template', 'terminal_import_callback',  
>>>>>>>> 'terminal_progress_callback', 'write']
>>>>>>>>
>>>>>>>> Is this what I should be expecting?  I tried to instantiate a  
>>>>>>>> filter (itk.AcosImageFilter) and get the LazyITKModule object has  
>>>>>>>> no attribute 'AcosImageFilter'  I guess my real question is, did  
>>>>>>>> I just take a step forward or a step backwards?  The end goal  
>>>>>>>> here is to be able to capture a list or dictionary of itk modules  
>>>>>>>> and the callable functions on those modules.
>>>>>>>>
>>>>>>>> Thanks a lot,
>>>>>>>> Erik
>>>>>>>>
>>>>>>>> Zachary Pincus wrote:
>>>>>>>>> So the general deal here is that the WrapITK Python libs have  
>>>>>>>>> tricky dependencies, and are slow to load fully. So 'import itk'  
>>>>>>>>> just gives you a bunch of proxy objects, that when you try to  
>>>>>>>>> use them, call some code (which can be a bit brittle, as you've  
>>>>>>>>> seen), to load the actual ITK libraries that are needed.
>>>>>>>>>
>>>>>>>>> It would appear that somehow, this loading is getting confused  
>>>>>>>>> about where to find the files it needs to load. This information  
>>>>>>>>> should be in (on your system)
>>>>>>>>> /usr/local/itk/Wrapping/WrapITK/Python/itkConfig.py
>>>>>>>>>  Could you send the contents of this file?
>>>>>>>>>
>>>>>>>>> In general, the python files you need would be in:
>>>>>>>>> /usr/local/itk/Wrapping/WrapITK/lib
>>>>>>>>> (I think...). Do you have a file VXLNumericsPython.py in that  
>>>>>>>>> directory?
>>>>>>>>>
>>>>>>>>> Zach
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Sep 25, 2006, at 11:55 AM, Erik Anderson wrote:
>>>>>>>>>
>>>>>>>>>> Hi all,
>>>>>>>>>>    I have successfully built ITK and WrapITK with (I think) the  
>>>>>>>>>> proper CMake options set.  In a Python shell, I am able to  
>>>>>>>>>> successfully import itk via
>>>>>>>>>>
>>>>>>>>>> import itk
>>>>>>>>>>
>>>>>>>>>> using dir on the module gives me a list of all the wrappings I  
>>>>>>>>>> would expect, however, upon instantiation of a class I get the  
>>>>>>>>>> following type of error:
>>>>>>>>>>
>>>>>>>>>> >>> f = itk.AcosImageFilter
>>>>>>>>>> Traceback (most recent call last):
>>>>>>>>>>  File "<stdin>", line 1, in ?
>>>>>>>>>>  File "/scratch/eranders/env/itk/Wrapping/WrapITK/Python/ 
>>>>>>>>>> itkLazy.py", line 18, in __getattribute__
>>>>>>>>>>    itkBase.LoadModule(module, namespace)
>>>>>>>>>>  File "/scratch/eranders/env/itk/Wrapping/WrapITK/Python/ 
>>>>>>>>>> itkBase.py", line 77, in LoadModule
>>>>>>>>>>    LoadModule(dep, namespace)
>>>>>>>>>>  File "/scratch/eranders/env/itk/Wrapping/WrapITK/Python/ 
>>>>>>>>>> itkBase.py", line 77, in LoadModule
>>>>>>>>>>    LoadModule(dep, namespace)
>>>>>>>>>>  File "/scratch/eranders/env/itk/Wrapping/WrapITK/Python/ 
>>>>>>>>>> itkBase.py", line 85, in LoadModule
>>>>>>>>>>    if not swigModuleName in sys.modules: module =  
>>>>>>>>>> loader.load(swigModuleName)
>>>>>>>>>>  File "/scratch/eranders/env/itk/Wrapping/WrapITK/Python/ 
>>>>>>>>>> itkBase.py", line 191, in load
>>>>>>>>>>    fp, pathname, description = imp.find_module(name)
>>>>>>>>>> ImportError: No module named VXLNumericsPython
>>>>>>>>>>
>>>>>>>>>> My environment is as follows:
>>>>>>>>>>
>>>>>>>>>> Python 2.4 on Suse 10.1
>>>>>>>>>> itk 2.8 built from CVS with WrapITK
>>>>>>>>>>
>>>>>>>>>> Environment variables set:
>>>>>>>>>> LD_LIBRARY_PATH = /usr/local/itk/bin
>>>>>>>>>> PYTHONPATH=/usr/local/itk/Wrapping/WrapITK/Python
>>>>>>>>>>
>>>>>>>>>> Any help would be great.
>>>>>>>>>>
>>>>>>>>>> Thansk,
>>>>>>>>>> Erik Anderson
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Insight-users mailing list
>>>>>>>>>> Insight-users at itk.org
>>>>>>>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Insight-users mailing list
>>>>>>>> Insight-users at itk.org
>>>>>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Insight-users mailing list
>>>> Insight-users at itk.org
>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>> _______________________________________________
>>> Insight-users mailing list
>>> Insight-users at itk.org
>>> http://www.itk.org/mailman/listinfo/insight-users
>>
>>
>>
>> --Gaëtan Lehmann
>> Biologie du Développement et de la Reproduction
>> INRA de Jouy-en-Josas (France)
>> tel: +33 1 34 65 29 66    fax: 01 34 65 29 09
>> http://voxel.jouy.inra.fr
>



-- 
Gaëtan Lehmann
Biologie du Développement et de la Reproduction
INRA de Jouy-en-Josas (France)
tel: +33 1 34 65 29 66    fax: 01 34 65 29 09
http://voxel.jouy.inra.fr


More information about the Insight-users mailing list