2011-04-12 89 views
1

我創建了一個WINDWOS服務利用下面的代碼窗口服務運行時:的Python腳本可以從命令行運行時,但沒有從

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

class aservice(win32serviceutil.ServiceFramework): 

    _svc_name_ = "PAStoDistillerIFC" 
    _svc_display_name_ = "PAS DW to Distiller Interface" 
    _svc_description_ = "Service that checks the Clinical Research folder for any new files from PAS to process in Distiller" 

    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 = 640000 #640 seconds/10 minutes (value is in milliseconds) 
     self.timeout = 120000  #120 seconds/2 minutes 
     # This is how long the service will wait to run/refresh itself (see script below) 

     while 1: 
     # Wait for service stop signal, if 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("PAStoDistillerIFC - STOPPED!") #For Event Log 
      break 
     else: 
       #[actual service code between rests] 
       try: 
        file_path = "D:\\SCRIPTS\\script.py" 
        execfile(file_path)    #Execute the script 
       except: 
        servicemanager.LogInfoMsg("File CRASHED") 
        pass 
       #[actual service code between rests] 


def ctrlHandler(ctrlType): 
    return True 

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

要運行此腳本:

import os, re, urllib, urllib2, time, datetime 
def postXML(path, fname): 
    fileresultop = open("D:\\CLinicalResearch\\SCRIPTS\\LOG.txt", 'a') # open result file 
    fileresultop.write('CheckXXX ') 
    fileresultop.close() 
    now = datetime.datetime.now() #####ALWAYS CRASHES HERE###### 
    fileresult = open("D:\\SCRIPTS\\IFCPYTHONLOG.txt", 'a') # open result file 
    fileresultop = open("D:\\SCRIPTS\\LOG.txt", 'a') 
    fileresultop.write('Check2 ') 
    fileresultop.close() 

path="D:\\Test2" # Put location of XML files here. 
procpath="D:\\Test2Processed" # Location of processed files 
now = datetime.datetime.now() 
dirList=os.listdir(path) 
for fname in dirList: # For each file in directory 
    if re.search("PatientIndexInsert", fname): # Brand new patient records 
       fileresultop = open("D:\\SCRIPTS\\LOG.txt", 'a') # open result file 
       fileresultop.write('Check1 ') 
       fileresultop.close() 
       postXML(path, fname) 

我有將腳本劃分爲裸碼,我相信這會崩潰。

這從命令行完美工作,我在我自己的登錄下運行Windows服務。 一旦我將datetime函數從函數中取出,它似乎就起作用了。

編輯1:我看到該服務在空白環境中運行。我自己沒有任何環境變量。

編輯2:新增追蹤:

File "D:\ClinicalResearch\SCRIPTS\PAS2DIST.py", line 23, in <module> 
    postXML(path, fname) 
File "D:\ClinicalResearch\SCRIPTS\PAS2DIST.py", line 6, in postXML 
    now = datetime.datetime.now() 
NameError: global name 'datetime' is not defined 
+0

你有沒有追溯到墜機事件?您可以使用'traceback'模塊將其作爲字符串獲取,以便在需要時進行記錄。 – 2011-04-12 12:09:14

+0

如果它在日期時間崩潰,我會認爲它必須處理配置文件的區域設置(或作爲服務運行時沒有上述設置)。在C++中會有'CreateProcessAsUser',也許有類似的python函數。 – 2011-04-12 12:13:48

+0

如果您在代碼開始時導入win32traceutil,則可以在安裝時使用win32traceutil.py(C:\ Python27 \ Lib \ site-packages \ win32 \ lib)來監視作爲服務運行時的輸出。這應該讓你看到更好的錯誤。 – 2011-04-12 12:17:33

回答

0

我沒有找到原因,但我沒有找到一個解決辦法。

我需要將所有相同的庫導入到函數中。一旦我做到了,就像魅力一樣。

希望這可以幫助別人。

相關問題