<div dir="ltr">Did some digging in the call stack:<div><br></div><div>pickle.py line 299:</div><div><br></div><div>if reduce</div><div>    rv = reduce(obj)</div><div><br></div><div>at some point (third recursion):</div><div>
<br></div><div>obj = <module '__main__' from 'd:\Documents\Code\python\floware\toolshed\tests\stackless_error_test.py'> </div><div><br></div><div>and in Wing debugger: </div><div><br></div><div>rv = (<built-in function wingdb_import_hook>, ('__main__', (), (), ('',))), which cannot be found</div>
<div><br></div><div>while in PyDev debugger:</div><div><br></div><div>rv =  (<built-in function __import__>, ('__main__', (), (), ('',))), which is found i guess</div><div><br></div><div>So that's where it finds 'wingdb_import_hook', but i think reduce(obj) is a C extension, because i cannot step into.</div>
<div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Oct 24, 2013 at 8:37 PM, lars van Gemerden <span dir="ltr"><<a href="mailto:lars@rational-it.com" target="_blank">lars@rational-it.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">made some more simple test cases (pickling Test1() and Test2() fails):<div><br></div><div>#-------------------------------------------------------------</div>
<div><div>import pickle</div><div><br></div><div>
def func(): pass</div><div><br></div><div>class Test0(object):</div><div>    def __init__(self):</div><div>        self.func = func</div><div><br></div><div>class Test1(object):</div><div>    def __init__(self):</div><div>

        self.func = lambda s: 0</div><div><br></div><div>class Test2(object):</div><div class="im"><div>    def __init__(self):</div><div>        self.func = self.func2</div><div>    def func2(self):</div></div><div>        pass</div>
<div>        </div>
<div>        </div><div>if __name__ == '__main__':</div><div>    </div><div>    s = pickle.dumps(Test0())</div><div>    t = pickle.loads(s)</div><div>    s = pickle.dumps(Test1()) #ERROR</div><div>    t = pickle.loads(s)</div>

<div>    s = pickle.dumps(Test2()) #ERROR</div><div>    t = pickle.loads(s)</div><div>    print 'done'</div></div><div><div>#-------------------------------------------------------------</div><div></div></div><div>

<br></div><div>all succeed in e.g. Idle.</div><div><br></div><div>Cheers, Lars</div><div><br></div></div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">On Thu, Oct 24, 2013 at 4:52 PM, Kristján Valur Jónsson <span dir="ltr"><<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><br>
> -----Original Message-----<br>
> From: <a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [mailto:<a href="mailto:stackless-" target="_blank">stackless-</a><br>
</div><div>> <a href="mailto:bounces@stackless.com" target="_blank">bounces@stackless.com</a>] On Behalf Of John Ehresman<br>
> Sent: 23. október 2013 15:06<br>
> To: <a href="mailto:stackless@stackless.com" target="_blank">stackless@stackless.com</a><br>
> Subject: Re: [Stackless] Fwd: deepcopying (pickling) channels<br>
><br>
</div><div>> It does look like the __init__ saves a reference of self.func2 in self.func -- is<br>
> this what triggers the pickling of globals?<br>
<br>
</div>Yes.  It is trying to pickle a bound function.<br>
But it is not pickling "globals".  save_global() means that it is trying to save an object by name.  It came across wingdb_import_hook during the process, and this function is not found where it says it is found.<br>


Now, where did it find the function?  We don't know.<br>
If you change pickle.py we might have a better idea.<br>
<br>
How about this:<br>
<br>
def save(self, obj):<br>
  try:<br>
    return self._save(obj)<br>
  except PickleError:<br>
    print "pickling obj: %r", obj<br>
    raise<br>
<br>
def _save(self, obj):<br>
  ... #rename old save to _save.<br>
<br>
<br>
This should give us more info.<br>
<div><div><br>
K<br>
<br>
<br>
_______________________________________________<br>
Stackless mailing list<br>
<a href="mailto:Stackless@stackless.com" target="_blank">Stackless@stackless.com</a><br>
<a href="http://www.stackless.com/mailman/listinfo/stackless" target="_blank">http://www.stackless.com/mailman/listinfo/stackless</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><div class="im">-- <br>====================================<br>Lars van Gemerden<br><a href="mailto:lars@rational-it.com" target="_blank">lars@rational-it.com</a><br>
<a href="tel:%2B31%206%2026%2088%2055%2039" value="+31626885539" target="_blank">+31 6 26 88 55 39</a><br>
====================================
</div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>====================================<br>Lars van Gemerden<br><a href="mailto:lars@rational-it.com">lars@rational-it.com</a><br>+31 6 26 88 55 39<br>====================================
</div>