Python Windows 服务的工作目录是什么?

2 投票
1 回答
2595 浏览
提问于 2025-04-16 15:36

我成功地用pywin32创建了一个Python Windows服务。在测试我的应用时,我试着让它打印一些东西(结果没有按我预期的那样工作),我还让它写入一个文件。它确实能写入文件,但文件却出现在了Python的库文件夹site-packages里。看起来这个文件夹就是它的工作目录,但我不太明白为什么会这样?我想知道怎么才能指定正确的工作目录。

我可以用完整的文件路径来打开文件,或者也许可以用os.cwd?哪种方法更好呢?

下面是构成我的Windows服务的两个文件。

import os
import sys
import win32service
import win32serviceutil
from twisted.internet import reactor
import xpress


class XPressService(win32serviceutil.ServiceFramework):

    _svc_name_ = 'XPress'
    _svc_display_name_ = 'XPress Longer Name'

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        reactor.callFromThread(reactor.stop)

    def SvcDoRun(self):
        xpress.main()
        reactor.run(installSignalHandlers=False)


if __name__ == "__main__":
    win32serviceutil.HandleCommandLine(XPressService)

下面是“xpress.py”,它是上面脚本中引入的。

import datetime

def main():
    with open('times', 'a') as f:
        print str(datetime.datetime.now())
        f.write(str(datetime.datetime.now()))

if __name__ == '__main__':
    main()

1 个回答

2

这两种方法都可以用,关键在于你需要什么。出于各种原因,最好使用文件名的绝对路径,这样你就不用担心你的应用程序在“哪里”运行,你只需要知道输出结果会在哪里(这才是最重要的)。在类Unix系统中,当没有指定工作目录时,应用程序通常是在根目录“/”下运行。如果你选择在其他目录工作,可以用 os.chdir(newDir) 来切换目录,记得在调用 win32serviceutil.HandleCommandLine 之前先执行这个命令。

我不太清楚Windows的默认设置,但你可能已经找到了,应该是在site-packages里的库目录。

撰写回答