有没有办法在python中保存变量值如果树莓派电源出现故障?

时间:2018-02-07 06:59:21

标签: python raspberry-pi

有没有办法在python中保存变量值如果出现电源故障,那么当我再次运行程序时,它不会从初始值开始,而是从最后保存的值开始。在下面的代码中我计算数字按下按钮的次数,我可以保存年龄值,并从15开始的保存值开始计数。

 import RPi.GPIO as GPIO
 import time
 age=15                   //initialize for debugging
 GPIO.setmode(GPIO.BCM)
 GPIO.setup(25, GPIO.IN,GPIO.PUD_DOWN)

 def led(channel):                     //funtion for increnment age
     global age
     age=(age+1)
     print(age)

PIN 7和3.3V

当连接1 时,

通常为0
 GPIO.add_event_detect(25, GPIO.RISING, callback=led, bouncetime=1000 )
 print(age)
 try:
     while(True):
            time.sleep(1)
 except KeyboardInterrupt:
           GPIO.cleanup()
           print (age)
           print ("Exiting")

2 个答案:

答案 0 :(得分:0)

执行此操作的典型方法是通过写入和写入文件。您可以在启动程序时从文件中读取程序状态,并在变量状态更改时修改文件。

为了保存更复杂的数据结构,存在Pickle模块。这允许对象被序列化。

答案 1 :(得分:0)

试试这个:

打开终端并输入以下内容以创建名为“led.txt”的文件:

>>>import pickle    
>>>s={'age':None}    
>>>with open('led.txt','w') as f:
...        f.write(pickle.dumps(s))

然后继续你的代码

 import RPi.GPIO as GPIO
 import time
 import pickle

 led_age={'age':None}  # initialise as dictionary

 with open('led.txt') as f: # open file in read mode  
   led_age = pickle.loads(f.read())  #initialize for debugging

 GPIO.setmode(GPIO.BCM)
 GPIO.setup(25, GPIO.IN,GPIO.PUD_DOWN)


 def led(channel): 
     global led_age       

     led_age['age'] += 1     # increment value
     with open('led.txt','w') as f:    # again open the file in write mode
       f.write(pickle.dumps(led_age))  #pickle the dictionary and write back to the file

     print(led_age)

而不是int变量我使用过字典。

函数led执行以下操作:

  1. 以只读模式(默认模式)打开文件'led.txt'并加载 字典
  2. 增加'年龄'
  3. 再次打开'led.txt'文件,但是在写模式下写回来 更新的词典
  4. pickle.dumps将字典序列化为字符串,pickle.loads执行反序列化

    每次调用 led 函数时,此更新将自动执行,led.txt文件将更新。

    注意:pickle的替代品可以是与其他语言兼容的JSON