如何为pywin32创建的Windows服务设置工作目录
使用pywin32创建Windows服务时配置工作目录的方法
当然可以配置工作目录,有两种常用的实现方式,适配不同场景:
方法一:在服务代码中主动切换目录
在你的服务类的SvcDoRun方法开头,直接用Python的os.chdir()切换到目标工作目录,后续读取配置文件的操作就会基于这个路径执行。示例代码如下:
import win32serviceutil import win32service import win32event import os class MyService(win32serviceutil.ServiceFramework): _svc_name_ = "MyCustomService" _svc_display_name_ = "My Custom Service" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): # 切换到指定工作目录 target_dir = "D:/MyService/ConfigFiles" if os.path.exists(target_dir): os.chdir(target_dir) # 后续读取配置文件的逻辑 with open("config.ini", "r") as f: config = f.read() # 服务主逻辑... if __name__ == '__main__': win32serviceutil.HandleCommandLine(MyService)
方法二:修改服务注册表项
Windows服务默认工作目录是C:\Windows\System32,你可以通过修改服务对应的注册表项指定自定义目录:
- 打开注册表编辑器(输入
regedit启动),定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[你的服务名] - 右键新建字符串值,命名为
WorkingDirectory,值设为目标绝对路径(比如D:\MyService\ConfigFiles) - 重启服务后,新的工作目录即可生效
注意事项
- 两种方法都建议使用绝对路径,避免因环境变量或默认路径变化导致文件找不到的问题
- 用代码切换目录时,最好先判断目录是否存在,避免抛出异常导致服务启动失败
- 修改注册表需要管理员权限,操作前建议备份相关项
内容的提问来源于stack exchange,提问作者Amit Rastogi
相关产品推荐
相关产品推荐

