V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
skywatcher
V2EX  ›  Python

python 创建 window service 无法启动

  •  
  •   skywatcher · 2016-01-22 01:53:55 +08:00 · 2757 次点击
    这是一个创建于 3214 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务可以安装,但是启动就自动停止,弹窗提示本地计算机上的 HelloWorld Service 启动后停止,某些服务在未由其他服务或程序使用时将自动停止,通过run.py运行没有问题,求解什么原因?

    class HelloWorldSvc (win32serviceutil.ServiceFramework):
        _svc_name_ = "HelloWorld-Service"
        _svc_display_name_ = "HelloWorld Service"
    
        def __init__(self,args):
            win32serviceutil.ServiceFramework.__init__(self,args)
            self.stop_event = win32event.CreateEvent(None,0,0,None)
            socket.setdefaulttimeout(60)
            self.stop_requested = False
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.stop_event)
            logging.info('Stopping service ...')
            self.stop_requested = True
    
        def SvcDoRun(self):
            servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STARTED,
                (self._svc_name_, '')
            )
            self.main()
    
        @staticmethod
        def main():
            file_path = os.path.split(os.path.realpath(__file__))[0] + '\\run.py'
            print file_path
            try:
                execfile(file_path)
            except:
                pass
    
    if __name__ == '__main__':
         win32serviceutil.HandleCommandLine(HelloWorldSvc)
    
    6 条回复    2016-01-22 23:01:02 +08:00
    webdev
        1
    webdev  
       2016-01-22 09:48:04 +08:00
    看下你安装的服务是在哪个用户下运行的(猜测),改成你自己登陆的用户试试
    chilaoqi
        2
    chilaoqi  
       2016-01-22 09:59:37 +08:00   ❤️ 1
    刚好最近刚做完。 http://chixq.com/articles/windows-agent/

    运行 eventvwr.msc 可以查看 service 出错事件是什么。
    大多数情况,是系统 local system ( service 默认)账户不能取到你写的 python module 。可以 cmd -> python -> import <your_module> 看是否成功。所以直接安装到 site-packages 肯定 OK 。

    run.py 肯定是可以的,注册 service 相对路径。 debug 肯定也可以。
    skywatcher
        3
    skywatcher  
    OP
       2016-01-22 15:12:10 +08:00
    @webdev 修改运行服务的用户?我试试看
    skywatcher
        4
    skywatcher  
    OP
       2016-01-22 15:32:04 +08:00
    @chilaoqi 是这样的,我刚看了你的文章,第一点没试(我是绝对路径调用`file_path = os.path.split(os.path.realpath(__file__))[0] + '\\run.py'`)所以路径下有文件应该不存在 import 问题。
    第二点,我取消了 print 语句。但是我代码里有对 exe 文件进行调用, exe 文件有内容输出,是不是也会导致无法启动?
    skywatcher
        5
    skywatcher  
    OP
       2016-01-22 21:19:03 +08:00
    @chilaoqi 服务属性显示使用的是本地账户;取消了 print 和执行 exe 的内容输出(执行 run.py 不会有任何输出),但是服务还是之前那个错误 /(ㄒoㄒ)/~~
    chilaoqi
        6
    chilaoqi  
       2016-01-22 23:01:02 +08:00
    @skywatcher 运行-> eventvwr.msc 可以看到服务启动不了的具体报错是什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.