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

  • isupportthegosselins

    isupporttheg

    6 Aralık 2009
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • ShayLoss

    ShayLoss

    5 Kasım 2009