使用任务管理器运行时出现 Win32Com 错误



我有一个python脚本,它调用打开一个Excel文件,调用文件中的宏,然后关闭。如果我从 CLI 运行该文件,它可以工作。如果我把它放在任务计划程序中,我会从win32com收到错误。

打开Excel文件的方法:

import win32com.client as WinCom
if os.path.exists(reportGeneratorFileName):
try:
xl = WinCom.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename=os.path.abspath(reportGeneratorFileName))
xl.Application.Visible = False
xl.Application.Run("'{}'!Runner.Runner".format(reportGeneratorFileName))
l.info('Start Sleeping')
# Async mode of pythonw causes this to finish before the file is made
time.sleep(300)
l.info('Done Sleeping')
xl.Application.Quit()
except Exception as e:
l.error('Error updating file')
l.error(e, exc_info=True)

这是我得到的错误:

06/04/2018 06:56:19 AM ERROR: (-2146959355, 'Server execution failed', None, None)
Traceback (most recent call last):
File "LAW Report.py", line 846, in createReport
xl = WinCom.Dispatch("Excel.Application")
File "c:python27libsite-packageswin32comclient__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "c:python27libsite-packageswin32comclientdynamic.py", line 114, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "c:python27libsite-packageswin32comclientdynamic.py", line 91, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
com_error: (-2146959355, 'Server execution failed', None, None)

现在我正在运行 64 位 python 2.7 和 64 位 win32com,而 office 是 32 位,但正如我上面所说,如果我只是从 CLI 运行脚本,它运行良好,只是不是从任务管理器。我在Windows Server 2012R2上运行它。我尝试为 2008、2008r2 和 2012r2 配置任务。我也尝试了最高的特权。无论用户是否登录,我都需要它才能运行。 每次我测试时,用户都已登录。

你需要 1( 在 DCOMCnfg 实用程序中为您正在运行的用户设置权限 - 或 - 2( 将用户更改为您的桌面用户帐户。

但首先您需要获取正确的错误代码,而不是通用消息。

请注意,这应被视为临时解决方案,因为 MS 对 DCOM 的自动化即服务支持很差。考虑尽快切换到任何库。Excel 互操作存在许多问题:您将不得不不时重新启动服务器、后续调用的性能下降、由于很有可能出错而无法并行运行 Excel,等等......

我遇到了同样的错误,我的程序可以从命令提示符运行,但不能从任务计划程序运行。

我使用任务计划程序中任务属性的这些设置解决了这个问题: 1. 一般>安全选项 答:确保用于运行 Python/Microsoft 程序的用户帐户相同。 b. 选中"仅在用户登录时运行。 c. 未选中的"隐藏">

对于 1a,我使用的是用于登录笔记本电脑/PC 的域\用户ID。

这是我发现使任务计划程序成功运行的唯一方法。希望这有帮助。

最新更新