pickle

All ESP32 boards running MicroPython.
Target audience: MicroPython users with an ESP32 board.
Post Reply
RobinMosedale
Posts: 40
Joined: Fri Jul 26, 2019 9:40 pm

pickle

Post by RobinMosedale » Mon Sep 13, 2021 7:34 pm

snippet of code

Code: Select all

import pickle

class configuration_data(object):
   def __init__(self):
      self.flashlight=True # by default flashlight on
      self.hour_start=0 # inhibit alarm hour start
      self.minute_start=0
      self.hour_end=0 # inhibit alarm hour
      self.minute_end=0
      self.inhibit_time=False

   def print_configuration(self):
      print('Flashlight on? ',self.flashlight)
      print('Inhibit time set? ',self.inhibit_time)
      print('Inhibit time start ',self.hour_start,':',self.minute_start)
      print('Inhibit time end ',self.hour_end,':',self.minute_end)

configuration=configuration_data() #create configuration object


print('Configuration ', configuration)
configuration.print_configuration()

try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded ')
   configuration.print_configuration()
except:
   print('Creating configuration file')
   configuration_file=open('configuration','wb')
   pickle.dump(configuration,configuration_file,protocol=None)
   configuration_file.close()
try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded with defaults')
   configuration.print_configuration()
except:
   print('Configuration load failed')

results in:
Creating configuration file
Traceback (most recent call last):
File "main.py", line 1, in <module>
File "main1.py", line 830, in <module>
TypeError: unexpected keyword argument 'protocol'

Omitting the protocol parameter:

Code: Select all

import pickle

class configuration_data(object):
   def __init__(self):
      self.flashlight=True # by default flashlight on
      self.hour_start=0 # inhibit alarm hour start
      self.minute_start=0
      self.hour_end=0 # inhibit alarm hour
      self.minute_end=0
      self.inhibit_time=False

   def print_configuration(self):
      print('Flashlight on? ',self.flashlight)
      print('Inhibit time set? ',self.inhibit_time)
      print('Inhibit time start ',self.hour_start,':',self.minute_start)
      print('Inhibit time end ',self.hour_end,':',self.minute_end)

configuration=configuration_data() #create configuration object


print('Configuration ', configuration)
configuration.print_configuration()

try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded ')
   configuration.print_configuration()
except:
   print('Creating configuration file')
   configuration_file=open('configuration','wb')
   pickle.dump(configuration,configuration_file)
   configuration_file.close()
try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded with defaults')
   configuration.print_configuration()
except:
   print('Configuration load failed')

results in:-
Configuration <configuration_data object at 3f94f4b0>
Flashlight on? True
Inhibit time set? False
Inhibit time start 0 : 0
Inhibit time end 0 : 0
Creating configuration file
Configuration load failed

>>> import pickle
>>> help(pickle)
object <module 'pickle' from '/lib/pickle.py'> is of type module
HIGHEST_PROTOCOL -- 0
dump -- <function dump at 0x3f94c180>
__name__ -- pickle
__file__ -- /lib/pickle.py
dumps -- <function dumps at 0x3f94c250>
load -- <function load at 0x3f94c0b0>
loads -- <function loads at 0x3f94c0c0>
>>>

pickle was installed by:
upip.install('pickle')

I've used pickle on Pi's happily.

What am I doing wrong?
Or have I the wrong pickle?

Alternatively I'll serialise a simple dictionary rather than binary object

I've probably stupidly overlooked something

Robin

User avatar
pythoncoder
Posts: 5956
Joined: Fri Jul 18, 2014 8:01 am
Location: UK
Contact:

Re: pickle

Post by pythoncoder » Tue Sep 14, 2021 5:34 am

There is a bug in the official pickle module and I raised an issue against it nearly two weeks ago. It is easily fixed for most data as stated in the issue.

However in general I recommend ujson, even though pickle is more powerful. This is because pickle uses the entire Micropython runtime which is very demanding of RAM. You might like to read my notes on serialisation for more details.
Peter Hinch
Index to my micropython libraries.

RobinMosedale
Posts: 40
Joined: Fri Jul 26, 2019 9:40 pm

Re: pickle

Post by RobinMosedale » Tue Sep 14, 2021 12:32 pm

Thank you Peter, as always.
I'll take your advice.

User avatar
pythoncoder
Posts: 5956
Joined: Fri Jul 18, 2014 8:01 am
Location: UK
Contact:

Re: pickle

Post by pythoncoder » Wed Sep 15, 2021 7:19 am

The bug I reported was a firmware issue which has gone away. It seems to be associated with a firmware build of V1.16. Upgrading to a daily build has fixed this for me.

My general comments still apply ;)
Peter Hinch
Index to my micropython libraries.

Post Reply