从 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 的特定实例的主要内容,如果未能解决你的问题,请参考以下文章