SORU
28 AĞUSTOS 2008, PERŞEMBE


Windows bir hizmet olarak bir Python betiği çalıştırmak mümkün mü? Mümkünse, nasıl?

Çeşitli birbiriyle ilişkili nesneleri bir veritabanında saklanan paylaşan bir dizi program için mimari çizim yapıyorum. Programlarından birini nesneler bu ve bu hizmet yoluyla nesneleri erişmek için diğer programları işlemleri için yüksek seviyeli bir arayüz sağlayan bir hizmet olarak hareket etmek istiyorum.

Şu anda Python ve bu hizmeti uygulamak için teknolojiler olarak Django çerçeve için nişan alıyorum. Linux Python programını şeytan nasıl düşündüm eminim. Ancak, sistem Windows desteklemelidir spec isteğe bağlı bir öğedir. Windows hizmetleri ile Windows programlama ve hiçbir deneyimi ile biraz deneyimim var.

Bir Python çalıştırmak için olası bir Windows hizmeti programları (i. e. otomatik olarak oturum açma kullanıcı) olmadan çalışacak?Mutlaka bu kısmı uygulamak istemiyorum, ama bu satırları tasarım birlikte karar vermek için yapılması ne kadar kaba bir fikir istiyorum.

. ben^>Edit: tüm cevaplar için Teşekkürler şimdiye kadar, oldukça kapsamlı. Bir şey daha öğrenmek istiyorum:Nasıl benim Windows hizmet farkında mı? Doğal Windows programları ile yönetebilir miyim?Temelde, ne /etc/init betiği Durdur/Başlat koyarak eşdeğerdir.d?

CEVAP
28 AĞUSTOS 2008, PERŞEMBE


Evet. Ben ActivePython ile birlikte gelir veya pywin32 (Windows uzantıları Python) ile yüklü olabilir pythoncom kütüphaneleri kullanarak.

Bu basit bir hizmet için temel bir iskelet

import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"

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

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

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

    def main(self):
        pass

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

Kodunuzu ana giderdim() SvcStop yöntemini ayarlamak yöntemi, genellikle bir bayrak denetleyerek interrumped olabilir bu sonsuz döngü bir çeşit

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hydejiaqi

    hydejiaqi

    12 Mart 2008
  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • Videogamerz | Call of Duty

    Videogamerz

    5 NİSAN 2012