python开启ansys软件问题 (2147221164, '类别未登录')

问题描述

重灌了几次ansys,又灌了其他软件之後,突然某一天发现用 oAnsoftApp = client.Dispatch("Ansoft.ElectronicsDesktop") 无法正常开启anays软件,错误为 com_error: (-2147221164, '类别未登录', none, none)

使用ipython来执行,详细问题如下 :

<ipython-input-2-9633b38a1caf> in <module>
----> 1 client.dynamic.Dispatch("Ansoft.ElectronicsDesktop")

c:\python37\lib\site-packages\win32com\client\dynamic.py in Dispatch(IDispatch, userName, createClass, typeinfo, UnicodeToString, clsctx)
    125 def Dispatch(IDispatch, userName = None, createClass = None, typeinfo = None, UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER):
    126         assert UnicodeToString is None, "this is deprecated and will go away"
--> 127         IDispatch, userName = _GetGoodDispatchAndUserName(IDispatch,userName,clsctx)
    128         if createClass is None:
    129                 createClass = CDispatch

c:\python37\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatchAndUserName(IDispatch, userName, clsctx)
    112         else:
    113                 userName = str(userName)
--> 114         return (_GetGoodDispatch(IDispatch, clsctx), userName)
    115
    116 def _GetDescInvokeType(entry, invoke_type):

c:\python37\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatch(IDispatch, clsctx)
     89                         IDispatch = pythoncom.connect(IDispatch)
     90                 except pythoncom.ole_error:
---> 91                         IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
     92         else:
     93                 # may already be a wrapped class.

com_error: (-2147221164, '类别未登录', none, none)

Debug路程

确认Prog_id是否存在

使用前一篇文章 提到的方式,确认是否存在 prog_id: Ansoft.ElectronicsDesktop 。 有!

由於之前的认知只到这里,第一次遇到有了prog_id还不能呼叫,google了一下,找到了这篇,还有一堆其他的,都是说python要用32位元才行,一开始想说应该不是这个问题,因为以前都可以正常呼叫,但找不到其他资料了,就试试看吧。

重灌python 32位元与pip

还好用 Chocolatey 卸载跟安装都超级快的,但是安装了32位元的python後,还是无法执行呀!!!

注册com object by regsvr32

试了上面的方法都不行,看来只能去研究windows的com元件了,首先确认一下 类别未登录 这个错误讯息,乱打一个 client.Dispatch("xxx"),错误讯息是不一样的,代表其实真的抓的到prog_id,只是在windows的某个地方 python抓不到 这个com object,那就来看怎注册这个元件瞜。

经过了一段时间的找资料後,跟着 windows官网指示 做了之後还是不行,其实说实在我根本不知道要注册哪一个dll,所以就到ansys的资料夹里面,把所有跟ansoft有关的dll都注册了一次,但还是不行呀!!!。

解决方法 - regserver

又尝试了一段时间,最後想到,其实只是单纯想用python去开启 ansysedt.exe,那有没有方法是直接注册 64位元的 exe档呢,於是找到了 regserver 的方式,在powershell中进到 AnsysEM\AnsysEM19.5\Win64 的资料夹中,执行 .\ansysedt.exe /regserver ,就可以成功开启了,太开心拉!!!

本文章同步发表於 https://mark-weng.com/ 中,欢迎参观讨论


<<:  Day35. 代理模式

>>:  [Golang]func的结构与特性整理-Part 2

[Day08] 什麽是贪婪法

#402 - Remove K Digits 连结: https://leetcode.com/p...

State 和生命周期(下) 正确的使用 State (Day6)

在上一篇新认识了 Class 物件里面会写一个 local (元件内)的 state 去管理储存元件...

从零开始的8-bit迷宫探险【Level 29】让你的 App 与众不同!设计 Icon 及 LaunchScreen

回到村子後,山姆变成了斜杠青年,他将探险的故事写成了一本书。 书的封面印着山姆的肖像。 而书名就叫...

[Day05] swift & kotlin 入门篇!(3) 基础语法-字串

字串 想当初刚在学习JAVA时 一段 new String("ami") != ...

Node.js安装

昨天介绍了Node.js,今天我们就要来实际安装Node.js啦 首先当然是到官网去下载Node.j...