[AstroPy] new pyfits version deletes NP_pyfits, breaking pickle

Jim Vickroy Jim.Vickroy at noaa.gov
Fri Nov 12 10:34:07 EST 2010

... not sure I really grasp your requirements and issues but you may 
want to take a look at pyyaml (http://pyyaml.org/).  I use it 
occasionally and find it very powerful for my needs. -- jv

On 11/12/2010 8:00 AM, Joe Harrington wrote:
> We use Python's OO capabilities extensively.  Our basic class has over
> 100 attributes, has a tree structure, and contains complex objects
> within itself.  For example, it contains several FITS headers.  We
> subclass it all the time, our analysis has branches for each exoplanet
> eclipse we analyze (we have over 100 of these now), and stuff gets
> added to each branch.  So, few of these objects even have the same
> attributes.  We can't write a save/load routine for each one.
> IDL and MATLAB both provide a robust save/load capability, and we now
> have Python routines that can handle those formats.  I hesitate to use
> them since I'm sure their object formats are different, but maybe they
> capture what's needed?  Has anyone tried using them to save/restore
> complex Python objects?
> What we need is a general facility for saving and loading such
> arbitrary objects.  While FITS (and better, HDF) might store all the
> components of an object, you'd have to write something that would
> disassemble and reassemble them with all their Python properties, such
> as the names of the data types, the tree structure, and so forth.
> That is what pickle does, and I think that its approach of importing
> to get the types it uses is the obvious one.  The problems come when
> the import changes, of course.
> > From the pickle side, I think the only other alternative would be
> something that recorded the structure and the names given to each
> attribute, and any other internal properties, attempted an import, and
> if they conflicted gave you what you saved and a warning that it is
> out of sync with the import.  You don't want just to create the old
> object and expect the user to figure it out when those objects are fed
> to new software that's expecting the new object.  And saving old
> *methods* could be disaster!
> > From the importee's side, including a version number in your object
> and checking it would let you have backward compatibility, as would
> providing unpicklers and converters when objects do change.
> --jh--
> Thomas Robitaille on Thu, 11 Nov 2010 18:25:28 -0500:
>>> Also, if you know of *any* other way to save an object, please say.
>> If you don't have too many different object types, and if you really
>> want long>  -term retrieval, then you may want to consider actually
>> not using p>  ickles, but for example in the case of FITS headers,
>> you could re>  ally just use the toTxtFile and fromTxtFile methods to
>> save and>  read from ASCII. I can see how pickling can be useful for
>> some inst>  ances, but I think FITS headers are definitely one
>> example where th>  ere is not much gain in using pickles over plain
>> old ASCII.>  You can always write your own 'pickle' module which
>> would decide>  how to deal with various datatypes, and use a plain
>> ASCII write>  /read for pyfits.Header objects.
>> Cheers,
>> Tom
>>> It seems pretty clear to me that to load objects from any kind of save
>>> file, you have to import the classes of the object and any objects it
>>> contains that are not standard Python objects.  So even if we had
>>> other methods for saving, they would have the same problem as pickle.
>>> But we have to be able to save objects!  Perhaps saving the definitions
>>> of the types rather than importing them would be the way to go?  I bet
>>> there's a long thread about this somewhere.
>>> --jh--
>>> On Thu, 11 Nov 2010 14:38:38 -0500, Perry Greenfield
>>> <perry at stsci.edu>  wrote>  :
>>>> We'll look into it. This is a general problem with pickles (and one
>>>> reason I've been hesitant to avoid using them like save files). I
>>>> wonder if there is a better solution than that. In this case we had to
>>>> clean out the previous numarray interface.
>>>> Perry
>>>> On Nov 10, 2010, at 7:24 PM, Joe Harrington wrote:
>>>>> My research group uses Python pickles to save data as it goes through
>>>>> our pipeline (.npy and .npz do not save objects, and neither does HDF,
>>>>> etc.).  These need to be loadable forever, as we often compare work to
>>>>> work done much earlier.  Some of the objects we save contain pyfits
>>>>> header objects.  Pickles have to import all classes used in the
>>>>> pickled objects before they load, and we are getting an ImportError
>>>>> about NP_pyfits.  The file NP_pyfits.py existed in stsci_python 2.8
>>>>> but is gone in 2.10.  The pickles refer to this object explicitly:
>>>>> ....
>>>>> sS'photchan'
>>>>> p494
>>>>> I3
>>>>> sS'header'
>>>>> p495
>>>>> (ipyfits.NP_pyfits
>>>>> Header
>>>>> p496
>>>>> (dp497
>>>>> S'_hdutype'
>>>>> p498
>>>>> cpyfits.NP_pyfits
>>>>> PrimaryHDU
>>>>> p499
>>>>> sS'ascard'
>>>>> p500
>>>>> ccopy_reg
>>>>> _reconstructor
>>>>> p501
>>>>> (cpyfits.NP_pyfits
>>>>> CardList
>>>>> p502
>>>>> c__builtin__
>>>>> list
>>>>> p503
>>>>> (lp504
>>>>> g501
>>>>> (cpyfits.NP_pyfits
>>>>> Card
>>>>> p505
>>>>> c__builtin__
>>>>> object
>>>>> p506
>>>>> NtRp507
>>>>> (dp508
>>>>> S'_valuestring'
>>>>> p509
>>>>> S'T'
>>>>> ....
>>>>> Is there any way to make our pickles readable again, other than
>>>>> running the old version of pyfits forever?  Can you provide a pickle
>>>>> converter that replaces the old names in the file with whatever is
>>>>> new?
>>>>> Please (everyone, not just STScI) be aware of this issue going
>>>>> forward.  Pickles are the only way we know of to save objects.  You
>>>>> can add things to your classes, but if you change what they import (or
>>>>> otherwise break pickle), nobody can restore your class across
>>>>> releases.
>>>>> Thanks,
>>>>> --jh--
>>> _______________________________________________
>>> AstroPy mailing list
>>> AstroPy at scipy.org
>>> http://mail.scipy.org/mailman/listinfo/astropy
> _______________________________________________
> AstroPy mailing list
> AstroPy at scipy.org
> http://mail.scipy.org/mailman/listinfo/astropy

More information about the AstroPy mailing list