在持续运行的python脚本中保持状态

时间:2014-01-16 12:01:05

标签: python python-2.7

我有一个python 2.7脚本,它非常不合适。

脚本不断运行,在每个循环中检查一些内容,将它们与之前的运行进行比较并做出一些决定。

我遇到的最大问题是变量,我有六打,而且由于范围的原因,我对它的使用方式有限。

例如

import time
import os

LOG_FILE = "/var/log/sc.log"
CHECK_FILE_TMP = "/tmp/myfile"
CHECK_FILE_USR = "/home/snoppy/testfile"
CHECK_FILE_TMP_TIME_INTERVAL = 20
CHECK_FILE_USR_TIME_INTERVAL = 30

def main():
    try:
         last_file_tmp_size = 0
         last_file_usr_size = 0
         last_file_tmp_mtime = 0
         last_file_usr_mtime = 0
         last_file_tmp_check_time = 0
         last_file_usr_check_time = 0
         tmp_file_changed = False
         usr_file_changed = False
         loop_start_time = 0


         print "Starting loop"

         while True:
            loop_start_time = time.time()
            if (time.time() - last_file_tmp_check_time > CHECK_FILE_TMP_TIME_INTERVAL):
                tmp_file_changed = checkFileChanged(CHECK_FILE_TMP, last_file_tmp_size, last_file_tmp_mtime)
                last_file_tmp_size = getFileSize(CHECK_FILE_TMP)
                last_file_tmp_mtime = getFileMTime(CHECK_FILE_TMP)
                if(tmp_file_changed):
                    logChange(CHECK_FILE_TMP, last_file_tmp_size, last_file_tmp_mtime)
                last_file_tmp_check_time = time.time()

            ....
            ....
            sleep(1)
    ...     

这就是我正在处理的事情。 我有局部变量,我似乎一直坚持,我必须将它们传递给函数 - 我不想把它们称为全局变量。

理想情况下....如果我能得到像

这样的main()函数
try:
   checkFile(CHECK_FILE_TMP)
   checkFile(CHECK_FILE_USR)
   sleep(0.1)
except:
...

因为主要是这么大!我必须在各处传递变量......感觉主要功能是如此臃肿!

也许......我可能要去上课?

1 个答案:

答案 0 :(得分:1)

您需要识别程序中可以从其特定详细信息中抽象并多次重复使用的部分。 这是一门艺术,不要指望它容易。您可以找到许多关于面向对象编程的书籍,这些书籍可以解释基础知识并为您提供指导。

这只是一个简单的例子:

class FileChecker(object):

    def __init__(self, path, interval):
        self.path = path
        self.interval = interval
        self.last_size = None
        self.last_mtime = None
        self.last_check_time = None

    def hasChanged(self):
        ...

    def logChange(self):
        ...

class MultiFileChecker(object):

    DELAY = 1

    def __init__(self):
        self.files = []
        self.loop_start_time = 0

    def addFile(self, f):
        self.files.append(f)

    def loop(self):
        try:
            print "Starting loop"
            while True:
                now = time.time()
                self.loop_start_time = now
                for f in self.files:
                    if now - f.last_check_time > f.interval:
                        if f.hasChanged():
                            f.logChange()
                ...
                sleep(self.DELAY)
            ...

if __name__ == '__main__':
    checker = MultiFileChecker()
    checker.add(FileChecker("/var/log/sc.log", 10))
    checker.add(FileChecker("/tmp/myfile", 20))
    checker.add(FileChecker("/home/snoppy/testfile", 30))
    checker.loop()