从 Python 通过 COM 访问 Enterprise Architect 的特定实例

Posted

技术标签:

【中文标题】从 Python 通过 COM 访问 Enterprise Architect 的特定实例【英文标题】:Accessing a specific instance of Enterprise Architect via COM from Python 【发布时间】:2021-12-22 08:57:10 【问题描述】:

可以从 Python 脚本中访问一个正在运行的 EA 实例,例如:

from win32com import client
eaApp = client.GetActiveObject("EA.App")
eaRepo = eaApp.Repository

但是,这似乎总是返回第一次启动的实例的 COM 对象。

假设我们有一个脚本需要启动一个新的 EA 实例。它通过调用os.startfile(eapxFile) 来实现,其中eapxFile 是一个空EA 文件的路径。然后它应该导入一些需要访问 COM 对象的 XMI 文件。

同时,还有几个其他(较旧的)EA 实例处于打开状态。 EA新实例的COM对象如何获取?

注意: 如果可以立即访问其 COM 对象,则启动 EA 新实例的另一种方法当然也是可行的。甚至可以直接使用 COM 接口。最重要的是,不能使用其他运行的EA实例。

【问题讨论】:

我不明白。如果您启动一个新实例,那么您已经拥有了 COM 对象,不是吗?不需要获取特定的运行实例。 @GeertBellekens 我猜他想从多个正在运行的实例中选择某个实例。我个人在所有情况下只处理一个 EA 实例。对我的脚本的简单要求。 @GeertBellekens 我通过调用 EA 可执行文件启动了新实例。 基本上,如果有办法为新创建的 EA 实例获取 COM 对象,那就太棒了。我尝试使用DispatchEx 来获取此处提到的“新”COM 对象:***.com/questions/18648933/… 但这似乎冻结了我的脚本。 @AnandSowmithiran 这正是 not 发生的情况。如果没有,Dispatch 最终会创建一个实例。但否则它会返回已经运行的那个并且创建一个新的。 【参考方案1】:

在 VBScript 中,您可以使用在全新的 EA 实例中创建 EA.Repository 对象

dim repository
set repository = CreateObject("EA.Repository")

Python 等价物似乎是

from comtypes.client import CreateObject
repository = CreateObject("EA.Repository")

然后使用打开一个模型

repository.OpenFile(myEapFile)

使用关闭模型

repository.CloseFile()

紧随其后

repository.Exit()

确保 ea.exe 进程的实例已关闭。

【讨论】:

很酷的东西,我不知道 comtypes 库。在 Python 控制台中使用它时,我看到 CreateObject 可靠地为我提供了 一个 新的 EA 实例,无论有多少其他 手动启动 EA 已经在运行。但是,一旦我使用CreateObject 启动一个 EA 实例,如果我再次尝试这样做,我要么得到与之前启动的相同的旧实例,要么控制台/脚本简单地冻结。猜测这可能是 EA 方面的一个问题。不幸的是,通过脚本启动多个 EA 实例对我们来说是一个用例...... 我添加了另一个问题,专门询问如何通过 COM 启动新的 EA:***.com/questions/70068010/… - 不能真正接受这是我提出的问题的答案。也可以随意把答案放在那里。 已验证这是有效的 :-) @Benjamin4991 这个新问题和这个问题一样,Geert回答得很好! 其实你是对的。

以上是关于从 Python 通过 COM 访问 Enterprise Architect 的特定实例的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 访问 Matlab 时逃避轮询

Python对microbit串口拒绝访问

从Python访问COM方法

通过 Python 从 Impala 访问表

通过 Python 从 Android 访问 LogCat

如何通过创建字典从python中的以下映射访问城市名称