2012-08-15 3 views
1

제 목표는 Windows 시스템 서비스를 설치하는 데 사용할 수있는 단일 (또는 여러 개의) .exe 파일을 만드는 것입니다. 현재 이것은 단지 개념 증명 일 뿐이므로 모든 서비스는 존재 여부를 확인하기 위해 파일에 기록합니다.py2exe 및 python 서비스 관련 문제

.py 파일에서 서비스를 호출하면 올바르게 설치되고 실행됩니다. py2exe를 사용하여 .exe를 만들면 제대로 실행되지만 Windows 이벤트 로그 (응용 프로그램)에서 특정 라이브러리를 찾을 수 없다는 메시지가 나타납니다. 때로는 Windows가 시작된 후 서비스를 중지하고 Windows가 "모듈을 찾을 수 없음"오류를 무시하는 경우가 있습니다. 이 모든 작업은 XP SP3 시스템에서 수행됩니다.

동일한 .exe 컴파일 된 w/py2exe를 Win 7 SP1 컴퓨터로 옮길 때 win7은 .exe가 python27.dll없이 실행할 수 없다는 것을 알려줍니다. 그래서 나는 .exe의 cwd에서 python27.dll을 옮기고 Win 7은 .dll을로드하지 못했다고 알려줍니다. XP SP2 컴퓨터에서 .exe를 실행하려고하면 XP에서 파일을로드 할 수 없다고 알려줍니다. 프롬프트에서 설치하는 데 사용되는 문자열

PySvc.py (이것은, PySvc.py 설치 실제 서비스입니다 : :

import win32service 
import win32serviceutil 
import win32event 
import servicemanager 

class PySvc(win32serviceutil.ServiceFramework): 
    _svc_name_ = "PySvc" 

    _svc_display_name_ = "Python Test" 
    _svc_description_ = "Service Test" 

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

    # Meat and potatos. This is the actual code that's run. Currently testing 
    # to see behavior inside and outside of loop. 
    def SvcDoRun(self): 


     f = open('test.dat', 'w+') 
     rc = None 
     f.write('OUTSIDE L00P\n') 
     # continue iteration if stop event not recieved 
     while rc != win32event.WAIT_OBJECT_0: 
      f.write('BEAUTIFUL TEST DATA NEW INSIDE L00P\n') 
      f.flush() 
      # block for 5 seconds and listen for a stop event 
      rc = win32event.WaitForSingleObject(self.hWaitStop, 5000) 

     f.write('SHUTTING DOWN\n') 
     f.close() 

    # called on shut down  
    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.hWaitStop) 

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

다음은 여기있다

는 해당 코드 "setup.py"에 대한 코드. setup.py py2exe에는 .EXE를 만드는 데 사용되는 문자열입니다.

from distutils.core import setup 
import py2exe 





setup(
      name = 'PySvc', 
      description = 'Service Test', 
      version = '1.00.00', 
       service = ['PySvc'], 

       console = ['PySvc.py'], 
       zipfile=None, 
       options = { 
           "py2exe":{ 
              "includes":"win32service,win32serviceutil,win32event,servicemanager", 


            }, 
          }, 
    )        

인해 다른 여러 가지의 로컬 머신하지만 실패에 .EXE의 명백한 성공 기계 (파이썬이 설치되어 있지 않음)에 대해, 나는 현재 이것이 수입이나 수입이 컴파일되는 방식에 문제가 있다고 생각한다. 이 .exe가 왜 그렇게 행동하고 싶지 않은지에 대한 통찰력을 누군가가 제공 할 수 있다면 영원히 감사 할 것입니다. 시간 내 주셔서 감사합니다.

답변

1

정보가 없어도 100 % 확신 할 수는 없지만 비슷한 문제가 발생했습니다. 파이썬 2.6, 2.7, 3.0, 3.1에서는 패키지와 함께 c 런타임 DLL을 번들 링해야한다는 것이 밝혀졌습니다.

이미 파이썬이 설치되어 있기 때문에 가능성이 있습니다. 최종 사용자는 그렇지 않을 것입니다. 이 문제에 대한 자세한 내용은 on py2exe's website.

입니다.