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

3
可以使用以下类似的Python脚本访问正在运行的EA实例:

一个正在运行的 EA 实例可以通过以下方式从 Python 脚本中访问:

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

然而,这似乎总是返回第一个启动的实例的COM对象。

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

同时,还有其他几个(较旧的)EA实例已打开。如何检索新的EA实例的COM对象?

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


@GeertBellekens 我通过调用EA可执行文件启动了新实例。 - Benjamin4991
基本上,如果有一种方法可以为新创建的EA实例获取COM对象,那将是非常棒的。我尝试使用DispatchEx来获取一个“新”的COM对象,如此处所述:https://dev59.com/lGMl5IYBdhLWcg3wJUEC 但这似乎只会冻结我的脚本。 - Benjamin4991
这个答案似乎指示了如何在Python中创建一个COM对象的新实例:https://dev59.com/GW435IYBdhLWcg3wnBh8#36711595 - Geert Bellekens
1
@AnandSowmithiran 这正是所谓的“不发生”的情况。如果不存在实例,则调度程序最终会创建一个实例。但是,如果已经有一个正在运行的实例,则返回该实例并且不会创建新实例。 - qwerty_so
太糟糕了。我相信一定有解决方案。我可以使用“CreateObject(“EA.Repository”)”在VBScript中完成它,因此一定有相应的方法在Python中实现相同的功能。 - Geert Bellekens
显示剩余17条评论
1个回答

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实例,无论已经运行了多少其他手动启动的EAs。但是,一旦我使用CreateObject启动了一个EA实例,如果我再试一次,要么我会得到我之前启动的同一个旧实例,要么控制台/脚本会冻结。猜测这可能是EAs方面的问题。不幸的是,通过脚本启动多个EA实例是我们的一个用例... - Benjamin4991
我添加了另一个问题,特别询问如何通过COM启动新的EA:https://stackoverflow.com/questions/70068010/get-a-com-object-of-a-new-enterprise-architect-instance-in-python - 无法将其作为我提出的问题的答案接受。请随意在那里放置答案。 - Benjamin4991
已验证此功能可用 :-) - qwerty_so
@Benjamin4991 这个新问题和这个问题一模一样,Geert已经回答得很好了! - qwerty_so
其实,你是对的。 - Benjamin4991

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接