在作为 Windows 服务运行的 Python 脚本中找不到模块错误

问题描述 投票:0回答:1

我有一个 Django“学习项目”,它托管一个非常简单的网站,

waitress
提供 WSGI 服务器。当我从命令行执行调用脚本时,项目按预期执行。

从这里开始,我尝试设置脚手架以使其作为 Windows 服务运行。我将

pywin32
servicemanager
安装到我的虚拟环境中,并且——后来,试图解决一个错误——也将它们安装到我机器上的“真实”Python 实例中。尽管如此,当我尝试启动创建的服务时,我不断收到
ModuleNotFoundError
错误,引用
servicemanager

这是我正在使用的 Python 脚本;它基于我在 here.

中找到的模板脚本
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
from waitress import serve
from django_project.wsgi import application

class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "PagesService"
    _svc_display_name_ = "Pages 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):
        serve(application, port='8000')

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

如上所述,我已经在虚拟环境和“真实”环境中都安装了

servicemanager
,我已经按照经典的 Roy 要求重新启动了机器,以确保万无一失。这是我从
pip freeze
得到的 requirements.txt 文件,它显示
servicemanager
在那里:

argcomplete==1.12.3
asgiref==3.6.0
atomicwrites==1.4.1
attrs==23.1.0
bottle==0.12.18
certifi==2022.12.7
chardet==3.0.4
colorama==0.4.6
Django==4.1.8
idna==2.10
more-itertools==9.1.0
mssql-django==1.2
packaging==23.1
pluggy==0.13.1
prettytable==0.7.2
py==1.11.0
PyHamcrest==2.0.2
pymongo==3.11.0
pyodbc==4.0.39
pytest==5.4.3
pytz==2023.3
pywin32==306
requests==2.24.0
servicemanager==2.0.10
sqlparse==0.4.4
tzdata==2023.3
urllib3==1.25.11
waitress==2.1.2
wcwidth==0.2.6

所以我不明白为什么找不到

servicemanager
模块或者我还能做些什么来让它可用。

python-3.x django windows-services waitress servicemanager
1个回答
0
投票

经过更多测试(阅读:黑暗中的镜头)并在谷歌中对由此产生的错误进行更广泛的挖掘,我在 Github 上找到这篇文章

发帖者的问题非常相似,只是具体错误不同。由于某些情况,发布者能够将其归结为

pywin32
与 Python 3.11 之间的不兼容(因为问题仅在他们从 3.10 升级到 3.11 时才出现)。关键是当他们恢复到 3.10 时问题就消失了。

所以我用当前的 3.10 版本 (3.10.11) 重建了我的环境,安装并运行了服务——现在它可以工作了。

© www.soinside.com 2019 - 2024. All rights reserved.