Я пытаюсь настроить службу 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()