我在 Python 中创建了一个 Windows 服务,它将在一些不活动超时后启动我的主应用程序(一个用 Python 构建的可执行文件)。该服务使用
win32event
为自身与我的主应用程序之间的通信设置同步事件。名为 'EXIT_EVENT'
的事件在服务启动时创建,并最终在我的主应用程序退出时发出信号,以便告诉服务“嘿,主应用程序不再打开,重新启动不活动计时器。”
当我使用
ServiceFramework
通过 py helperservice.py debug
CLI 在调试模式下运行我的服务时,一切都按预期工作。
但是当我使用 Services.msc 正常“启动”服务时,我的主应用程序在尝试访问同步事件时抛出异常。
# helperservice.py
import win32event
exit_event = win32event.CreateEvent(
None, # no security flags
True, # make this a resettable event
False, # initialize to False
'EXIT_EVENT' # name
)
# app.py
import win32event
try:
exit_event_hdl = win32event.OpenEvent(
win32event.EVENT_ALL_ACCESS, # permissions
True, # bInheritHandle flag (not sure I need this)
'EXIT_EVENT',
)
except win32event.error as err:
print(err)
当我的应用程序尝试访问如图所示的命名事件时,它失败并出现以下错误:
pywintypes.error: (2, 'OpenEvent', 'The system cannot find the file specified.')
如果主应用程序启动时服务未运行,我预计会发生此错误,但在这种情况下,服务绝对在主应用程序之前启动。
就好像命名事件在“正常”运行服务时没有创建,但它是在
debug
模式下运行时创建的。为什么这个事件交互被正常用例破坏了?据我所知,问题在于对 OpenEvent
的调用,因为我已经验证对 CreateEvent
的调用按预期返回了一个 PyHANDLE
对象。
一如既往地非常感谢任何见解/信息。
可能相关的其他信息:
我的主应用程序是通过 pyinstaller 构建为单文件可执行文件的,服务在不活动超时后通过调用
subprocess.Popen('<path>/<to>/app.exe')
打开它。这部分工作 - 应用程序已启动,但此后不久失败,出现上述异常。
编辑:
这似乎是伪装成文件错误的权限错误!通过 CLI 在调试模式下运行时,我正在运行管理员提示符。但是我的应用程序本身正在以一般权限运行!我只是尝试从非高架提示运行
py helperservice.py debug
并得到相同的错误,加上一个更有用的 pywintypes.error: (5, 'RegOpenKeyEx', 'Access is denied.')
错误。
我想现在的问题是:如果可能的话,我如何在没有以提升权限运行的应用程序的情况下从我的应用程序向我的服务发出信号(我不能这样做 - 这是运行此应用程序的要求在一般用户帐户下)。
欢迎任何想法!