2012-01-20 39 views
16

Tôi đang cố gắng để bắt đầu một ví dụ dịch vụ đơn giản:Không thể bắt đầu dịch vụ Windows được viết bằng Python (win32serviceutil)

someservice.py:

import win32serviceutil 
import win32service 
import win32event 

class SmallestPythonService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "SmallestPythonService" 
    _svc_display_name_ = "display service" 

    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): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

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

Khi tôi chạy

python someservice.py install 

mọi thứ đều ổn và dịch vụ xuất hiện trong danh sách dịch vụ Windows, nhưng

python someservice.py start 

không thành công với "Lỗi 1053: Dịch vụ không phản hồi yêu cầu bắt đầu hoặc kiểm soát kịp thời", nhưng không có bất kỳ sự chậm trễ nào.

Tôi googled một giải pháp, cho biết điều đó xảy ra khi pythonservice.exe không thể định vị python27.dll. Nó thực sự không thể vì vậy tôi đã thêm C:\Python27 đến PATH. Bây giờ pythonservice.exe chạy tốt, nhưng Lỗi 1053 vẫn còn ở đó.

Tôi đang chạy Python 2.7.2 với pywin32 216 trên Windows 7 Ultimate với đặc quyền quản trị viên.

+0

Điều này làm việc cho tôi, chạy Python 2.6.6 (64 bit) và pywin32 216 amd64-py26. Tôi nhận ra rằng đó không phải là rất hữu ích mặc dù. Trên Windows 7 Pro. – jgritty

+3

+1 để đề cập đến lỗi 1053 xảy ra nếu 'pythonservice.exe' không thể định vị' python27.dll'. Đưa tôi mãi mãi để tìm ra điều này! Cảm ơn :) – Gili

Trả lời

3

Tôi tin rằng vấn đề của bạn sẽ được cố định bởi nếu bạn thay đổi phương thức SvcDoRun

từ

def SvcDoRun(self): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

để

def SvcDoRun(self): 
     self.ReportServiceStatus(win32service.SERVICE_RUNNING) 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
9

Ngoài ra, nhờ chỉ ra rằng nó có thể là một vấn đề DLL đã giúp tôi tìm ra giải pháp đúng. Những gì bạn cần làm là thêm Python27 vào SYSTEM PATH chứ không phải USER PATH, vì mặc định dịch vụ python sẽ được cài đặt dưới dạng 'LocalSystem' và vì vậy khi nó cố gắng khởi động nó, hãy sử dụng SYSTEM Biến PATH - đó là lý do tại sao bạn có thể chạy nó từ dấu nhắc lệnh, USER PATH của bạn là đúng.

Hy vọng điều đó sẽ hữu ích!

+5

Nó có thể hữu ích trong trường hợp này cũng để thêm các thư mục này vào đường dẫn hệ thống của bạn: 'C: \ Python27 \ Lib \ site-packages \ win32' và' C: \ Python27 \ Lib \ site-packages \ pywin32_system32' . Điều đó sẽ cho phép bạn sử dụng pythonservice dễ dàng hơn. – BuvinJ

+0

@BuvinJ Điều này đã sửa lỗi 1053 của tôi khi sử dụng PythonService.exe. cảm ơn bạn! – Kenneth

+0

@mpaf Bạn có thể giúp mô tả cách thêm nội dung vào Đường dẫn hệ thống không? Ah tôi thấy, bạn chỉ cần thêm nó vào đường dẫn hệ thống máy tính tổng thể trong 'System Control Panel'.Cá nhân tôi đã phải thêm anaconda như trong https://www.snip2code.com/Snippet/770602/setup-python-script-as-windows-service –

1

Một mẹo hữu ích là thêm dòng sau

sys.frozen = 'windows_exe' # Fake py2exe so we can debug

trước khi bạn gọi

win32serviceutil.HandleCommandLine(...)

Bằng cách đó bạn có thể nhận được thông tin hữu ích hơn từ các dịch vụ về những gì khó khăn.

Các vấn đề liên quan