Как Вы запускаете скрипт Python как услуга в Windows?

SFINAE - это замена. Итак, заменим!

template<
  typename T, 
  std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

template<
  typename T, 
  std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

Становится:

template<
  class T=int, 
  int* = nullptr>
void Add(int) {}

template<
  class T=int, 
  Substitution failure* = nullptr>
void Add(int) {

template<
  class T=double, 
  Substitution failure* = nullptr>
void Add(double) {}

template<
  class T=double
  double* = nullptr>
void Add(double) {}

Удаляет ошибки, которые мы получаем:

template<
  class T=int, 
  int* = nullptr>
void Add(int) {}
template<
  class T=double
  double* = nullptr>
void Add(double) {}

Теперь удаляет значения параметров шаблона :

template<
  class T, 
  int*>
void Add(T) {}
template<
  class T
  double*>
void Add(T) {}

Это разные шаблоны.

Теперь тот, который испортился:

template<
  typename T, 
  typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}

template<
  typename T, 
  typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}

Становится:

template<
  typename T=int, 
  typename =int>
void Add(int) {}

template<
  typename int, 
  typename = Substitution failure >
void Add(int) {}

template<
  typename T=double, 
  typename = Substitution failure >
void Add(double) {}

template<
  typename T=double, 
  typename = double>
void Add(double) {}

Удалять сбои:

template<
  typename T=int, 
  typename =int>
void Add(int) {}
template<
  typename T=double, 
  typename = double>
void Add(double) {}

И теперь значения шаблона шаблона:

template<
  typename T, 
  typename>
void Add(T) {}
template<
  typename T, 
  typename>
void Add(T) {}

Это одна и та же подпись шаблона. И это не разрешено, генерируется ошибка.

Почему такое правило? Помимо объема этого ответа. Я просто демонстрирую, как эти два случая отличаются друг от друга, и утверждая, что стандарт рассматривает их по-разному.

Когда вы используете параметр шаблона непигового типа, как указано выше, вы изменяете подпись шаблона не только шаблона значения параметров. Когда вы используете параметр шаблона типа, как указано выше, вы изменяете только значения параметров шаблона.

245
задан Undo 27 February 2018 в 11:29
поделиться

2 ответа

Да Вы можете. Я делаю это пользующийся pythoncom библиотеками, которые приезжают включенные с ActivePython или могут быть установлены с pywin32 (Python для расширений Windows).

Это - основной каркас для простого сервиса:

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)

Ваш код входил бы main() method— обычно с некоторым бесконечным циклом, который мог бы быть прерван путем проверки флага, который Вы устанавливаете в SvcStop метод

242
ответ дан artburkart 23 November 2019 в 03:07
поделиться

Существует пара альтернатив для установки как услуга фактически любого исполняемого файла Windows.

Метод 1: Используйте instsrv и srvany из rktools.exe

Для Windows Home Server или Windows Server 2003 (работы с WinXP также), , Инструменты Набора Ресурса Windows Server 2003 идут с утилитами, которые можно использовать в тандеме для этого, назвать instsrv.exe и srvany.exe . См. эту статью KB137890 Microsoft KB для получения дополнительной информации о том, как использовать эти utils.

Для Windows Home Server, существует большая удобная для пользователя обертка для этих утилит, названных точно" Любой Сервисный Установщик ".

Метод 2: Используйте ServiceInstaller для Windows NT

существует другая альтернатива с помощью ServiceInstaller для Windows NT ( загружаемый здесь ) с инструкции по Python, доступные . Вопреки имени это работает и с Windows 2000 и с Windows XP также. Вот некоторые инструкции для того, как установить сценарий Python как услуга.

Установка Выполнения сценария

Python ServiceInstaller для создания нового сервиса. (В этом примере предполагается, что Python установлен в c:\python25)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

После установки, откройте Сервисный апплет Панели управления, выберите и запустите услуги PythonTest.

После того, как мой первоначальный ответ, который я заметил, был тесно связанным Q& уже отправленный на ТАК. См. также:

я могу выполнить сценарий Python как услуга (в Windows)? Как?

, Как я делаю Windows, знающий о сервисе, который я записал в Python?

24
ответ дан Community 23 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: