如何刷新 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)
如果您需要更多信息或者这没有意义,请告诉我!
编辑:开放赏金。让我们得到一个答案!
编辑:添加调试文件。
- 首先,添加
sleep(5)
循环结束时的命令(就在 continue 语句之前),这样服务就不会在不安的循环中吃掉你的 CPU :)
- 您在服务启动时加载协议文件列表。文件是提前创建的吗?
- 我会添加更多调试信息(例如,在关键点添加更多打印命令)和 运行 来自命令行的脚本,所以我会看到它到底卡在哪里。
- 这只是我的意见,你可以接受也可以不接受,但我强烈建议你花一些时间来提高你的 OOP 技能,你的代码对我来说太程序化了:)
好的,所以我做了一个 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)
如果您需要更多信息或者这没有意义,请告诉我!
编辑:开放赏金。让我们得到一个答案! 编辑:添加调试文件。
- 首先,添加
sleep(5)
循环结束时的命令(就在 continue 语句之前),这样服务就不会在不安的循环中吃掉你的 CPU :)
- 您在服务启动时加载协议文件列表。文件是提前创建的吗?
- 我会添加更多调试信息(例如,在关键点添加更多打印命令)和 运行 来自命令行的脚本,所以我会看到它到底卡在哪里。
- 这只是我的意见,你可以接受也可以不接受,但我强烈建议你花一些时间来提高你的 OOP 技能,你的代码对我来说太程序化了:)