复杂类的Python pickle

2024-05-20 22:04:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个windows服务来监视来自控制系统的信号。我用两个类(IOSignal和Control)对系统进行了建模。每个控件实例都有一些与之关联的IOSignals实例。当与特定控件关联的所有iosignal都处于特定状态时,我希望该服务执行某些操作。在我的实际代码中,它将在数据库中注册此事件。为了解释我的问题,我为我的原始代码创建了一个非常简化的版本。 问题是,当它作为服务运行时,我希望存储所有控件和IOSignal实例的状态,这样当我重新启动服务时,我可以“记住”系统停止时的状态。我用泡菜来做这个。似乎pickling部分正在工作,因为显然我可以在另一个脚本中打开文件并检索对象的信息。 我的系统的复杂性在于,我在每个控件对象中都存储了IOSignals实例,反之亦然。 当我启动服务时,服务似乎可以正常工作,但是当我重新启动它时,我开始收到错误消息,表明重新创建的对象没有某些属性(主要是'd'和'logger') 我重载了getstaesetstate方法,试图使pickle正常工作,但我认为我遗漏了一些东西。我遵循了python文档(https://docs.python.org/2.0/lib/pickle-example.html)中给出的说明

这是我的类的代码(我将它们保存在一个名为观察者.py)在

# -*- coding: utf-8 -*-
"""
Created on Wed Aug  2 11:07:28 2017

@author: me
"""
from logging import getLogger
#import logging

class IOSignal(object):

    def __init__(self,tag,val='True'):
        self.tag=tag
        self.value=val
        self.CONTROLS=[]

        #logger
        self.logger=getLogger('teste.IOSignals')

        # dict to serialize 
        self.d={}
        self.d['tag']=self.tag
        self.d['value']=self.value
        self.d['CONTROLS']=self.CONTROLS

    def getTag(self):
        return self.tag

    def getValue(self):
        return self.value

    def UpdateIOSinal(self,val):
        self.value=val
        try:
            for control in self.CONTROLS:
                #self.logger.debug('updating controls')
                control.update()
        except Exception as e:
               self.logger.error("Error updating signal - ErrMsg -> {}".format(str(e)))

    def AppendControl(self,control):
        self.CONTROLS.append(control)

    def UpdateControls(self):
        for control in self.CONTROLS:
            control.update()

    def __getstate__(self):
        return self.d

    def __setstate__(self, d):
        self.tag=d['tag']
        self.value=d['value']
        self.CONTROLS=d['CONTROLS']
        self.__dict__= d


class Control(object):

    def __init__(self,tag,state=False):
         self.tag=tag
         self.state=state
         self.IOSignals={}

         #logger
         self.logger=getLogger('teste.CONTROLS')

         # dict to serialize 
         self.d={}
         self.d['tag']=self.tag
         self.d['state']=self.state
         self.d['IOSignals']=self.IOSignals


    def getTag(self):
        return self.tag

    def getState(self):
        return self.state

    def register_signal(self,signal):
        self.IOSignals[len(self.IOSignals)]=signal

    def update(self):
        try:
            I=len([e.value for e in self.IOSignals.values() if e.value=='False'])
            if I==len(self.IOSignals):
                self.logger.info("Control {} actuated".format(self.tag))
        except Exception as e:
               self.logger.error("Error updating Contro - ErrMsg -> {}".format(str(e)))

    def __getstate__(self):
        return self.d

    def __setstate__(self, d):
        self.tag=d['tag']
        self.state=d['state']
        self.IOSignals=d['IOSignals']

        self.__dict__= d     

下面是创建服务和使用Observer的代码。我叫它teste_服务.py 要安装它,请在命令行中输入以下命令“python c:\pathtofile\teste_服务.py安装”并在Windows服务中运行。 服务的名称是TEST_Event_service。在

^{pr2}$

这是日志记录集

[loggers]
keys=root,teste

[handlers]
keys=logfile,consoleHandler

[formatters]
keys=simpleFormatter,logfileformatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_teste]
level=DEBUG
handlers=logfile
qualname=teste
propagate=0

[formatter_logfileformatter]
format=%(asctime)s %(name)-12s: %(levelname)s %(message)s

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_logfile]
class=handlers.RotatingFileHandler
level=DEBUG
args=(r'C:\tier3\teste\pyteste.log','a',5000000,20)
formatter=logfileformatter

我认为我的问题在于getstatesetstate定义。在

下面是我收到的错误消息的示例。在

2017-08-02 22:58:00,348 teste.SERVICE: ERROR Error saving cache - ErrMsg -> 'IOSignal' object has no attribute 'd'
2017-08-02 22:58:10,366 teste.SERVICE: ERROR Unexpected Error - 'IOSignal' object has no attribute 'logger'

有人知道我的问题在哪里?在


Tags: 实例selfformatreturnvaluedeftaglogger
1条回答
网友
1楼 · 发布于 2024-05-20 22:04:08

我设法找到了一个不是我想要的解决方案。由于实例没有被完美地重新创建,所以每次服务运行时我都会创建所有实例,并检查是否有缓存文件。如果有,我用缓存中的信息调整实例状态。这是修改后的代码观察者.py. 我创建了新的方法来设置我需要的值。在

相关问题 更多 >