sys.path неверен при запуске службы pywin32, установленной с помощью virtualenv (проект Django) - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь настроить службу Windows, которая будет запускать мой проект Django с Pywin32, CherryPy и Python3.6. Я сделал это успешно с Python3.5, но обновление приводит к тому, что sys.path выглядит так, как будто virtualenv не активен.

При попытке запустить службу я получаю ошибку службы, которая говорит

"Windows не удалось запустить службу Project CherryPy на локальном компьютере Компьютер. Для получения дополнительной информации просмотрите журнал системных событий. Если это является услугой не Microsoft, обратитесь к поставщику услуги и обратитесь к специфичный для службы код ошибки 1. "

Просматривая журнал событий, я вижу, что Django не загружается:

from django.core.wsgi import get_wsgi_application
  ModuleNotFoundError: No module named 'django'

После проверки я вижу, что ни один из моих путей к virtualenv проектов не находится в sys.path, за исключением "... \ lib \ site-packages \ win32", который по некоторым причинам добавляется дважды.

Так как мне заставить службу работать с правильным активным virtualenv без добавления вручную каждого необходимого пути (чтобы он работал с будущими разработками и т. Д.)? Следующие работы с Python3.5:

CherryPyService.py:

import cherrypy
import win32serviceutil
import win32service

import sys
import os

from my_project import wsgi

DEPLOY_DIRECTORY = "C:/home/code/my_project/"
ERROR_LOG = os.path.join(DEPLOY_DIRECTORY,"service_logs","cherry_py_err.log")
STD_ERR = os.path.join(DEPLOY_DIRECTORY,"service_logs","std_err.log")
STD_OUT = os.path.join(DEPLOY_DIRECTORY,"service_logs","std_out.log")
sys.stdout = open(STD_OUT,'a')
sys.stderr = open(STD_ERR,'a')


class ProjectService(win32serviceutil.ServiceFramework):

    _svc_name_ = "ProjectCherryPyService"
    _svc_display_name_ = "Project CherryPy Service"

    def SvcDoRun(self):

        sys.path.append(DEPLOY_DIRECTORY)
        os.environ['DJANGO_SETTINGS_MODULE'] = 'my_project.settings'
        os.chdir(DEPLOY_DIRECTORY)

        cherrypy.tree.graft(wsgi.application)
        cherrypy.config.update({
            'global':{
                'log.error_file':ERROR_LOG,
                'log.screen': False,
                'tools.log_tracebacks.on':True,
                'engine.autoreload.on': False,
                'engine.SIGHUP': None,
                'engine.SIGTERM': None,
                'server.socket_port': 8030,
                }
            })
        cherrypy.engine.start()
        cherrypy.engine.block()

    def SvcStop(self):

        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        cherrypy.engine.exit()
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)


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

wsgi.py:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
...