【问题标题】:Win32Com Error Running with Task Manager使用任务管理器运行 Win32Com 错误
【发布时间】:2018-06-04 16:12:03
【问题描述】:

我有一个 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:\python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File "c:\python27\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "c:\python27\lib\site-packages\win32com\client\dynamic.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 配置任务。我也尝试过最高权限。无论用户是否登录,我都需要它才能运行。每次我测试,用户都已经登录了。

【问题讨论】:

    标签: python-2.7 scheduled-tasks win32com


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在 CLI 和任务管理器中使用相同的帐户。
    • 尝试将reportGeneratorFileName输出到某个日志,看看从外部获取文件名是否有问题(名称中有空格)
    • 也尝试输出到日志 os.path.abspath(reportGeneratorFileName) (查看问题是否链接到相对文件名和无效的当前目录)
    • excel文件与脚本在同一目录下。文件名中确实有空格,所以我尝试删除它们。仍然得到同样的东西。我觉得很奇怪,我可以从命令行运行脚本并且一切都很好,但作为一项任务却不是。
    • 当前目录呢?它们是一样的吗?
    【解决方案2】:

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

    我通过任务计划程序中的这些任务属性设置解决了这个问题: 1.常规->安全选项 一个。确保您用于运行 python/microsoft 程序的用户帐户相同。 湾。选中“仅在用户登录时运行。 C。未选中“隐藏”

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

    这是我找到的让任务调度程序成功运行的唯一方法。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2021-03-08
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多