[Stackless] Error for the pickle of a module in a package + patch

Richard Tew richard.m.tew at gmail.com
Thu Nov 8 15:01:30 CET 2007


On 11/8/07, Alain Poirier <alain.poirier at net-ng.com> wrote:
> When a module in a package is pickled then unpickled, the result is
> the package, not the module:
>
> Python 2.5.1 Stackless 3.1b3 060516 (release25-maint, Oct 18 2007, 22:24:34)
> [GCC 3.4.6 (Gentoo 3.4.6-r2, ssp-3.4.6-1.0, pie-8.7.10)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import cPickle
> >>> import xml.sax
> >>> m = xml.sax
> >>> print "Before :", hasattr(m, 'parse')
> Before : True
> >>> m = cPickle.loads(cPickle.dumps(m))
> >>> print "After :", hasattr(m, 'parse')
> After : False
> >>> m
> <module 'xml' from '/opt/stackless_ori/lib/python2.5/xml/__init__.pyc'>
>
>
> because the pickle engine do a `__import__('xml.sax')` instead of a
> `__import__('xml.sax', fromlist=(''))`
>
>
> The following patch solves the problem:
>
> --- stackless-251-export/Stackless/pickling/prickelpit.c        2007-05-01
> 12:25:50.000000000 +0200
> +++ stackless-251-export.new/Stackless/pickling/prickelpit.c    2007-11-07
> 16:20:07.000000000 +0100
> @@ -1181,7 +1181,7 @@
>                 if (import == NULL)
>                         return NULL;
>         }
> -       return Py_BuildValue("(O(s))", import, name);
> +       return Py_BuildValue("(O(s()()(s)))", import, name, "");
>         /* would be shorter, but the search result is quite arbitrary:
>                 tup = PyObject_GetAttrString(m, "__name__");
>          */

Thanks for the patch.  There's another pickling related patch from a
few weeks ago which needs to go in as well.  Once Kristjan Valur's new
crash fix is in along with these, it will probably be worth doing a
new release of Stackless.

Cheers,
Richard.




More information about the Stackless mailing list