如何刷新 Python 服务中的 if 语句

How to refresh if statement in Python Service

好的,所以我做了一个 python 服务来获取当前时间并检查目录中的所有文件。如果该目录中的文件与当前时间相同,则应读取该文件并按照其中的命令进行操作。例如:如果当前时间是 7:30,那么如果它在 'Time' 目录中找到名为“7_30.protocol”(可能是“07_30.protocol”)的文件,它应该读取它并执行里面的命令。如果这是当前时间,它工作正常,但如果不是,你必须等待时间,那么它就不会工作。这是我的代码。我做错了什么?我现在已经编辑添加调试文件了!

import win32service
import win32serviceutil
import win32event
from time import *
import glob, os, dw, winmod2

def trim_protocol(name):
     return name[:-9]

class MySvc(win32serviceutil.ServiceFramework):
    _svc_name_ = "MySvc"
    _svc_display_name_ = "My Service"
    _svc_description_ = "This is just My Service"
    debug = open("C:/LIP/ServiceDebugging.txt", "w")

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.debug.write("Closing service...\n")
        self.debug.write("Service closed!")
        self.debug.close()
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        import servicemanager
        self.timeout = 3000
        profile_filenames = []
        for file in os.listdir("C:/LIP/LIP Source Files/Config/Commands/Profiles/Time"):
            if file.endswith(".protocol"):
                profile_filenames.append(file)

        profile_titles = map(trim_protocol, profile_filenames)
        profiles = list(profile_titles)
        times = [i.replace('_', ':') for i in profiles]
        HD = os.getenv("SystemDrive")

        while 1:
            rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout)
            if rc == win32event.WAIT_OBJECT_0:
                break
            else:
                self.debug.write("Service running...\n")
                current_time = strftime("%H:%M", localtime())
                if current_time in times:
                    self.debug.write("Found a file matching the current time! Opening and running...\n")
                    filename = current_time.replace(":", "_")
                    filename = filename + ".protocol"
                    file = open(HD + "/LIP/LIP Source Files/Config/Commands/Profiles/Time/" + filename, "r")
                    commands = file.read()
                    exec(commands)
                    file.close()
                    current_time = strftime("%H:%M", localtime())
                    self.debug.write("Commands have been run! Sleeping till the next minute!...\n")
                    sleep(60)
                else:
                    self.debug.write("No time match found! Moving on...\n")
                    print("Standing by...")

                sleep(5)
                continue


if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MySvc)

如果您需要更多信息或者这没有意义,请告诉我!

编辑:开放赏金。让我们得到一个答案! 编辑:添加调试文件。

  1. 首先,添加

sleep(5)

循环结束时的命令(就在 continue 语句之前),这样服务就不会在不安的循环中吃掉你的 CPU :)

  1. 您在服务启动时加载协议文件列表。文件是提前创建的吗?
  2. 我会添加更多调试信息(例如,在关键点添加更多打印命令)和 运行 来自命令行的脚本,所以我会看到它到底卡在哪里。
  3. 这只是我的意见,你可以接受也可以不接受,但我强烈建议你花一些时间来提高你的 OOP 技能,你的代码对我来说太程序化了:)