"I run this with the default settings in wing IDE. If i run it in IDLE, there is no exception." That sounds like the problem. Boy, do I hate how hard it is to debug pickling problems. for "pickle" we really should have a flag that prints out the hierarchy as it is pickling. Maybe someone has already done that?
Anyway, I'll install Wingware and see if I can reproduce it there. I'm sure wingware is messing with pickling in some unexpected way. (I'm unfamiliar with wingware, btw. If you feel up to it, try putting debugging code inside pickle.py to dump out what it is doing, that might be faster. I would guess that it is doing something with the copy_reg module and this is messing with our function pickling. K From: [email protected] [mailto:[email protected]] On Behalf Of lars van Gemerden Sent: 10. október 2013 15:24 To: The Stackless Python Mailing List Subject: Re: [Stackless] Fwd: deepcopying (pickling) channels the callstack is: pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __builtin__.function File "d:\Documents\Code\python\floware\toolshed\tests\stackless_test.py", line 34, in <module> print pickle.dumps(t) #ERROR File "C:\Python27\lib\pickle.py", line 1411, in dumps Pickler(file, protocol).dump(obj) File "C:\Python27\lib\pickle.py", line 231, in dump self.save(obj) File "C:\Python27\lib\pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 661, in save_dict self._batch_setitems(obj.iteritems()) File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems save(v) File "C:\Python27\lib\pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 569, in save_tuple save(element) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 607, in save_list self._batch_appends(iter(obj)) File "C:\Python27\lib\pickle.py", line 622, in _batch_appends save(x) File "C:\Python27\lib\pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 569, in save_tuple save(element) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 607, in save_list self._batch_appends(iter(obj)) File "C:\Python27\lib\pickle.py", line 622, in _batch_appends save(x) File "C:\Python27\lib\pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 569, in save_tuple save(element) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 661, in save_dict self._batch_setitems(obj.iteritems()) File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems save(v) <== THIS LINE File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 802, in save_function return self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 569, in save_tuple save(element) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 661, in save_dict self._batch_setitems(obj.iteritems()) File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems save(v) File "C:\Python27\lib\pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "C:\Python27\lib\pickle.py", line 426, in save_reduce save(state) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 661, in save_dict self._batch_setitems(obj.iteritems()) File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems save(v) File "C:\Python27\lib\pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 760, in save_global (obj, module, name)) Probably not that usefull without values ... in THIS LINE above, v is module C:\python27\lib\new.pyc. I don't think there is a framework in place that would influence this script, the imports (pickle, stackless) are unaltered. I run this with the default settings in wing IDE. If i run it in IDLE, there is no exception. On Thu, Oct 10, 2013 at 3:22 PM, Kristján Valur Jónsson <[email protected]<mailto:[email protected]>> wrote: The error is weird. It seems to be trying to pickle the "function" type. It shouldn't try doing that. Now, I know that pickling channels with tasklets on them works. This is what stackless does. I tried saving your code into a module and just running it from the command line. I wonder if there is some copy_reg magic that is interfering with the code. How are you running it? Is this when running the code as a module, or when typing it in from the console? Are you trying this in a stand-alone environment or in some application framework? Finally, can I see the full traceback for the pickle exception. If you are using pickle (and not cPickle) a traceback can help us find out why it is failing. K From: [email protected]<mailto:[email protected]> [mailto:[email protected]<mailto:[email protected]>] On Behalf Of lars van Gemerden Sent: 9. október 2013 12:48 To: The Stackless Python Mailing List Subject: Re: [Stackless] Fwd: deepcopying (pickling) channels Hi Kristjan, the version i am using is: python 2.7.5 Stackless 3.1b3 (from binary). I think the stackless mailsystem was a little off, i tried with pickle.dumps (see mail history below), with the error: pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __builtin__.function. "stackless.run() returns when there are no runnable tasklets ...", ok, clear, thanks. Cheers, Lars On Wed, Oct 9, 2013 at 2:36 PM, lars van Gemerden <[email protected]<mailto:[email protected]>> wrote: I am reasonably familiar with pickle (e.g. i know you cant pickle most functions), but this is pretty stackless specific: why can i pickle an empty channel, but not a sending/receiving channel? Cheers, Lars On Mon, Oct 7, 2013 at 7:50 PM, Anselm Kruis <[email protected]<mailto:[email protected]>> wrote: Hi Lars, you are observing well known deficiencies of the pickle/cPickle implementation of Python. Perhaps sPickle (http://pypi.python.org/pypi/sPickle) can pickle the channels. Regards Anselm Am 06.10.2013 08<tel:06.10.2013%2008>:58, schrieb lars van Gemerden: maybe double but i got a mail bounce .. ---------- Forwarded message ---------- From: lars van Gemerden <[email protected]<mailto:[email protected]>> Date: Thu, Oct 3, 2013 at 6:15 PM Subject: Re: [Stackless] deepcopying (pickling) channels To: The Stackless Python Mailing List <[email protected]<mailto:[email protected]>> actually both give an error. The only thing different is the error message. with pickle the code would be: --------------------------------------------------------------------------- import stackless, pickle class Test(object): def __init__(self): self.channel = stackless.channel() def run(self): stackless.tasklet(self.sender)() stackless.tasklet(self.receiver)() stackless.run() def sender(self): counter = 0 while counter < 10: self.channel.send(counter) counter += 1 def receiver(self): counter = 0 while counter < 12: counter = self.channel.receive() print counter, print "done" if __name__ == "__main__": t = Test() t.run() t.channel = None s = pickle.dumps(t) #OK t = Test() t.run() s = pickle.dumps(t) #ERROR ----------------------------------------------------------------------------- and the error: pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __builtin__.function otherwise the error behavior is the same as decribed above. Cheers, Lars (as far as i have read and tested a bit, deepcopy allows more to be copied then pickle, but cPickle is faster, so i have my own deepcopy: def deepcopy(obj): try: return cPickle.loads(cPickle.dumps(obj, -1)) except PicklingError: return copy.deepcopy(obj) ) On Thu, Oct 3, 2013 at 5:19 AM, Richard Tew <[email protected]<mailto:[email protected]>> wrote: I'm a little confused. Are you pickling the tasklets, or copying them? These are different things to Python. As far as I know using copy or deepcopy has never been supported for tasklets and therefore channels. Pickling however, is another matter. Cheers, Richard. _______________________________________________ Stackless mailing list [email protected]<mailto:[email protected]> http://www.stackless.com/mailman/listinfo/stackless maybe double but i got a mail bounce .. ---------- Forwarded message ---------- From: *lars van Gemerden* <[email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>>> Date: Thu, Oct 3, 2013 at 6:15 PM Subject: Re: [Stackless] deepcopying (pickling) channels To: The Stackless Python Mailing List <[email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>>> actually both give an error. The only thing different is the error message. with pickle the code would be: --------------------------------------------------------------------------- import stackless, pickle class Test(object): def __init__(self): self.channel = stackless.channel() def run(self): stackless.tasklet(self.sender)() stackless.tasklet(self.receiver)() stackless.run() def sender(self): counter = 0 while counter < 10: self.channel.send(counter) counter += 1 def receiver(self): counter = 0 while counter < 12: counter = self.channel.receive() print counter, print "done" if __name__ == "__main__": t = Test() t.run() t.channel = None s = pickle.dumps(t) #OK t = Test() t.run() s = pickle.dumps(t) #ERROR ----------------------------------------------------------------------------- and the error: pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __builtin__.function otherwise the error behavior is the same as decribed above. Cheers, Lars (as far as i have read and tested a bit, deepcopy allows more to be copied then pickle, but cPickle is faster, so i have my own deepcopy: def deepcopy(obj): try: return cPickle.loads(cPickle.dumps(obj, -1)) except PicklingError: return copy.deepcopy(obj) ) On Thu, Oct 3, 2013 at 5:19 AM, Richard Tew <[email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>>> wrote: I'm a little confused. Are you pickling the tasklets, or copying them? These are different things to Python. As far as I know using copy or deepcopy has never been supported for tasklets and therefore channels. Pickling however, is another matter. Cheers, Richard. _______________________________________________ Stackless mailing list [email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>> http://www.stackless.com/mailman/listinfo/stackless -- ==================================== Lars van Gemerden [email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>> +31 6 26 88 55 39<tel:%2B31%206%2026%2088%2055%2039> <tel:%2B31%206%2026%2088%2055%2039> ==================================== -- ==================================== Lars van Gemerden [email protected]<mailto:[email protected]> <mailto:[email protected]<mailto:[email protected]>> +31 6 26 88 55 39<tel:%2B31%206%2026%2088%2055%2039> ==================================== _______________________________________________ Stackless mailing list [email protected]<mailto:[email protected]> http://www.stackless.com/mailman/listinfo/stackless -- Dipl. Phys. Anselm Kruis science + computing ag Senior Solution Architect Ingolstädter Str. 22 email [email protected]<mailto:[email protected]> 80807 München, Germany phone +49 89 356386 874<tel:%2B49%2089%20356386%20874> fax 737 www.science-computing.de<http://www.science-computing.de> -- Vorstandsvorsitzender/Chairman of the board of management: Gerd-Lothar Leonhart Vorstand/Board of Management: Dr. Bernd Finkbeiner, Michael Heinrichs, Dr. Arno Steitz, Dr. Ingrid Zech Vorsitzender des Aufsichtsrats/ Chairman of the Supervisory Board: Philippe Miltin Sitz/Registered Office: Tuebingen Registergericht/Registration Court: Stuttgart Registernummer/Commercial Register No.: HRB 382196 _______________________________________________ Stackless mailing list [email protected]<mailto:[email protected]> http://www.stackless.com/mailman/listinfo/stackless -- ==================================== Lars van Gemerden [email protected]<mailto:[email protected]> +31 6 26 88 55 39<tel:%2B31%206%2026%2088%2055%2039> ==================================== -- ==================================== Lars van Gemerden [email protected]<mailto:[email protected]> +31 6 26 88 55 39<tel:%2B31%206%2026%2088%2055%2039> ==================================== _______________________________________________ Stackless mailing list [email protected]<mailto:[email protected]> http://www.stackless.com/mailman/listinfo/stackless -- ==================================== Lars van Gemerden [email protected]<mailto:[email protected]> +31 6 26 88 55 39 ====================================
_______________________________________________ Stackless mailing list [email protected] http://www.stackless.com/mailman/listinfo/stackless
