2012-05-17 2 views
2

ниже - это мой код, который я пытаюсь превратить в службу Windows. Вы увидите test.py как вызов, который он делает, и все это короткий скрипт, который записывается в файл журнала (в качестве теста).Программа Python как служба Windows

Код, который должен сделать это службой Windows, и делает это хорошо, но когда я запустил его, ничего не записывается в файл журнала. Помощь очень ценится. Ниже приведен код:

import win32service 
import win32serviceutil 
import win32api 
import win32con 
import win32event 
import win32evtlogutil 
import os, sys, string, time 

class aservice(win32serviceutil.ServiceFramework): 

    _svc_name_ = "MyServiceShortName" 
    _svc_display_name_ = "A python test" 
    _svc_description_ = "Writing to a log" 

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

    def SvcStop(self): 
      self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
      win32event.SetEvent(self.hWaitStop)      

    def SvcDoRun(self): 
     import servicemanager  
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, '')) 

    self.timeout = 1000  #1 seconds 
    # This is how long the service will wait to run/refresh itself (see script below) 

    while 1: 
    # Wait for service stop signal, if I timeout, loop again 
    rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout) 
    # Check to see if self.hWaitStop happened 
    if rc == win32event.WAIT_OBJECT_0: 
     # Stop signal encountered 
     servicemanager.LogInfoMsg("SomeShortNameVersion - STOPPED!") #For Event Log 
     break 
    else: 

       #what to run 
       try: 
         file_path = "test.py" 
         execfile(file_path) 
       except: 
         pass 
      #end of what to run 


def ctrlHandler(ctrlType): 
    return True 

if __name__ == '__main__': 
    win32api.SetConsoleCtrlHandler(ctrlHandler, True) 
    win32serviceutil.HandleCommandLine(aservice) 

Edit: Мысль ради этого я бы включить код своего test.py файла, то есть ненужный импорт, но будет получить работу, если вы запустите его в одиночку.

import win32service 
import win32serviceutil 
import win32api 
import win32con 
import win32event 
import win32evtlogutil 
import os 
logfile = open("log.txt", "a") #open file to log restart timestamp 
logfile.write("\nthat's good!!!!") 
logfile.close() 
+2

Где именно это 'while 1:' code block? Похоже, что это на верхнем уровне класса. Это законно? Вы можете снова проверить отступ и убедиться, что все выглядит правильно? – sarnold

+0

Вы пробовали указать путь к файлу журнала? Я не уверен, в каком каталоге служба «работает». –

+0

@andrewcooke Да, я пробовал несколько способов, даже просто позвонив. Например, выньте file_pat = "test.py" и просто поставьте оператор печати или метод ведения журнала. – user1399840

ответ

2

Хорошо, так я понял это и хотел бы вернуться и пост в случае, если кто-то имеет дело с этим, хотя все это было немного уникальным.

Вы должны указать путь к файлу, если находитесь в службе windows, duh ... но это не было сделано, и я вытащил свои волосы без причины.

file_path = "test.py" 

должен был

file_path = r"c:\users\...\test.py" 

Будьте осторожны при использовании '\' для путей файлов Windows. Они должны быть экранированы как «\\», или строка должна быть объявлена ​​как необработанная строка («r»). Использование разделителей unix как slash '/' также работает, но может выглядеть странно для пользователей Windows.