使用 win32com.client 检索 COM 错误,类似于 VBS

Retrieving COM errors with win32com.client similar to VBS

我有一个名为 "SAS Enterprise Guide" 的应用程序,它是一个与 SAS 平台兼容的流程开发程序。在其中,我根据自己的喜好创建一个流程,然后我可以 "schedule" 它。这个 "scheduling" 进程输出一个 vbs 脚本并创建一个 Task Scheduler 对象。 vbs 脚本创建一个 COM 对象,打开过程流项目,运行s 它,保存它,然后关闭它。就是这样,总的来说这是一个非常简短的脚本。

由于多种原因,该过程非常低效,因此我编写了一个 python 脚本来迭代一堆 EG 项目(尝试以这种方式安排 30 多个脚本是不可行的)。

import win32com.client, os

os.chdir('EG Scripts')
app = win32com.client.Dispatch("SASEGObjectModel.Application.7.1")

for file in os.listdir()

    project = app.Open(file, "")

    project.Run()
    project.Save()
    project.Close()
    project = None

app.Quit()
app = None
del app

但是,他们提供的 vbs 脚本似乎包含一些错误捕获功能,我也想这样做,但我不确定如何做。为了进行测试,我创建了一个 EG 项目,该项目将在 100% 的时间内失败。当我 运行 它通过 python 时,它只是默默地失败了。我知道脚本没有成功执行,但控制台没有返回或打印任何内容。

在他们提供的脚本中,我看到了他们运行这些行:

Set app = CreateObject("SASEGObjectModel.Application.7.1")
If Checkerror("CreateObject") = True Then
    Exit Sub
End If

Function Checkerror(fnName)
    Checkerror = False

    Dim strmsg
    Dim errNum

    If Err.Number <> 0 Then
        strmsg = "Error #" & Hex(Err.Number) & vbCrLf & "In Function " & fnName & vbCrLf & Err.Description
        'MsgBox strmsg  'Uncomment this line if you want to be notified via MessageBox of Errors in the script.
        Checkerror = True
    End If

End Function

但我似乎想不出如何在 python 中复制它。有人有什么主意吗?

2年过去了,对EG的COM接口也熟悉多了。

Running SAS EG project with Python

在那里,我对一个类似的问题写了一个相当广泛的答案。我建议阅读(并阅读 Chris Hemedinger 对官方 SAS 文档的参考)。

具体到这个,我发现答案是 运行 项目,将项目保存到临时文件,然后重新打开项目以读取错误日志。

要读取日志,您需要遍历流中的每个项目,检查日志,然后在日志文本中扫描 "ERROR"。如果流程项是 egData 项,则针对 egTask 项对其进行迭代并读取这些日志。

正如我所说,Chris Hemedinger 编写了很棒的文档,包括对所有 EG 类型代码的查找。虽然 Python 中没有示例,但它非常易于访问。当前 link 到 2017 年写的 SAS 文章在这里:https://communities.sas.com/t5/SAS-Communities-Library/Doing-More-with-SAS-Enterprise-Guide-Automation/ta-p/417832?title=Not_Just_for_Scheduling:_Doing_More_with_SAS_Enterprise_Guide_Automation

如果有人有任何疑问或问题,请告诉我。