运行 Python 参数为 Windows 服务的脚本

Run Python script with parameter as Windows Service

我用 python 创建了一个 Windows 服务。当我 运行 使用调试模式时它工作得很好,但是当我启动服务时它不起作用。这是我的脚本示例:

def run(param):
    subprocess.Popen(["C:\SER\txt_write.pyw",param], shell=True)
#txt_write is a simple script: put the parameter into b.txt

def add_param():
    x="123456"
    run(x)

class PythonCornerExample(SMWinservice):
    _svc_name_ = "name"
    _svc_display_name_ = "name disp"
    _svc_description_ = "desc"

    def start(self):
        self.isrunning = True

    def stop(self):
        self.isrunning = False

    def main(self):
        i=0
        while self.isrunning:
            add_param()
            f= open("C:\SER\a.txt","a+")
            f.write("xyz")
            f.close()
            
            time.sleep(25)

if __name__ == '__main__':
    PythonCornerExample.parse_command_line()

所以,当我 运行 这个脚本处于调试模式时,它将“xyz”文本放入 a.txt,并调用另一个 python 脚本,将参数 (123456) 放入b.txt。这就是我希望它的工作方式。

我的问题是,安装为 Windows 服务 a.txt 有效,但 b.txt 无效。

我的脚本有什么问题?为什么在调试模式下可以,为什么在服务模式下会出错?

用下面的代码更改最后两行:

import servicemanager, sys
if __name__ == '__main__':
  if len(sys.argv) == 1:
    servicemanager.Initialize()
    servicemanager.PrepareToHostSingle(PythonCornerExample)
    servicemanager.StartServiceCtrlDispatcher()
else:
    PythonCornerExample.parse_command_line()

服务启动传递的参数在你class的构造方法的args参数中。

class AppServerSvc (win32serviceutil.ServiceFramework):   

def __init__(self, **args**):

你希望它们在 sys.argv 中,如果参数来自命令行,你会在那里得到它们。

所以我就这样做了。

sys.argv = args

现在我正在解析我的服务参数,就像它来自命令行一样。

:)