首页 > 解决方案 > 将 OLE 调用从 MATLAB 转换为 Python

问题描述

我有一个关于 OLE 方法的问题。我有一个 MATLAB 脚本,它使用 OLE 从数据记录软件 (Magneti Marelli Wintax) 中读取,它工作正常。

这是脚本:

%%%%%Create WinTAX4 Server Object..
oWTX4 = actxserver('WinTax4.Application');
oWTX4.visible = 'TRUE';    
%%%%%Get the Data From WinTAX4....    
%%%%% get the current DataSet Loaded in WinTAX4..    
myData = oWTX4.CurrentData;    
myDataLoad = invoke(myData, 'Item', 0);    
%%%%% LapTime is..    
myDataLoadTime = get(myDataLoad, 'Time' );    
MyChannels = get(myDataLoad, 'Channels');    

%%%%% only for demonstration purpose, get the channel "accx_can" ..

MyChannel = invoke(MyChannels, 'Item', 'accx_can')

此脚本在变量中返回MyChannel包含所有数据的浮点数组。

然后我想在 Python 中做同样的事情,我有点迷失了:

from win32com.client.dynamic import Dispatch
import pandas as pd
import inspect
wintax = Dispatch('WinTax4.Application')
wintax.Visible = True
myData = wintax.CurrentData(0)

到这里我可以加载数据。(0) 是 Wintax 中第一个打开的数据集,(1) 是第二个数据集,依此类推。但后来我完全迷失在翻译成 Python 了MyChannel = invoke(MyChannels, 'Item', 'accx_can')。由于调用函数是典型的 MATLAB。并且myData实际上不是数据,而是仍然是 OLE 对象。

inspect.getmembers(myData)

返回

[('_ApplyTypes_',
  <bound method CDispatch._ApplyTypes_ of <COMObject <unknown>>>),
 ('_FlagAsMethod',
  <bound method CDispatch._FlagAsMethod of <COMObject <unknown>>>),
 ('_LazyAddAttr_',
  <bound method CDispatch._LazyAddAttr_ of <COMObject <unknown>>>),
 ('_NewEnum', <bound method CDispatch._NewEnum of <COMObject <unknown>>>),
 ('_Release_', <bound method CDispatch._Release_ of <COMObject <unknown>>>),
 ('__AttrToID__',
  <bound method CDispatch.__AttrToID__ of <COMObject <unknown>>>),
 ('__LazyMap__',
  <bound method CDispatch.__LazyMap__ of <COMObject <unknown>>>),
 ('__bool__', <bound method CDispatch.__bool__ of <COMObject <unknown>>>),
 ('__call__', <bound method CDispatch.__call__ of <COMObject <unknown>>>),
 ('__class__', win32com.client.dynamic.CDispatch),
 ('__delattr__',
  <method-wrapper '__delattr__' of CDispatch object at 0x0000027BCD707610>),
 ('__dict__',
  {'_oleobj_': <PyIDispatch at 0x0000027BCC17B500 with obj at 0x0000027B9A8B3918>,
   '_username_': '<unknown>',
   '_olerepr_': <win32com.client.build.LazyDispatchItem at 0x27bcd7077f0>,
   '_mapCachedItems_': {},
   '_builtMethods_': {},
   '_enum_': None,
   '_unicode_to_string_': None,
   '_lazydata_': (<PyITypeInfo at 0x0000027BCC17B530 with obj at 0x0000027B9A8B33D8>,
    <PyITypeComp at 0x0000027BCC230A20 with obj at 0x0000027B9A8B3BB8>)}),
 ('__dir__', <function CDispatch.__dir__()>),
 ('__doc__', None),
 ('__eq__', <bound method CDispatch.__eq__ of <COMObject <unknown>>>),
 ('__format__', <function CDispatch.__format__(format_spec, /)>),
 ('__ge__',
  <method-wrapper '__ge__' of CDispatch object at 0x0000027BCD707610>),
 ('__getattr__',
  <bound method CDispatch.__getattr__ of <COMObject <unknown>>>),
 ('__getattribute__',
  <method-wrapper '__getattribute__' of CDispatch object at 0x0000027BCD707610>),
 ('__getitem__',
  <bound method CDispatch.__getitem__ of <COMObject <unknown>>>),
 ('__gt__',
  <method-wrapper '__gt__' of CDispatch object at 0x0000027BCD707610>),
 ('__hash__', None),
 ('__init__', <bound method CDispatch.__init__ of <COMObject <unknown>>>),
 ('__init_subclass__', <function CDispatch.__init_subclass__>),
 ('__int__', <bound method CDispatch.__int__ of <COMObject <unknown>>>),
 ('__le__',
  <method-wrapper '__le__' of CDispatch object at 0x0000027BCD707610>),
 ('__len__', <bound method CDispatch.__len__ of <COMObject <unknown>>>),
 ('__lt__',
  <method-wrapper '__lt__' of CDispatch object at 0x0000027BCD707610>),
 ('__module__', 'win32com.client.dynamic'),
 ('__ne__', <bound method CDispatch.__ne__ of <COMObject <unknown>>>),
 ('__new__', <function object.__new__(*args, **kwargs)>),
 ('__reduce__', <function CDispatch.__reduce__()>),
 ('__reduce_ex__', <function CDispatch.__reduce_ex__(protocol, /)>),
 ('__repr__', <bound method CDispatch.__repr__ of <COMObject <unknown>>>),
 ('__setattr__',
  <bound method CDispatch.__setattr__ of <COMObject <unknown>>>),
 ('__setitem__',
  <bound method CDispatch.__setitem__ of <COMObject <unknown>>>),
 ('__sizeof__', <function CDispatch.__sizeof__()>),
 ('__str__', <bound method CDispatch.__str__ of <COMObject <unknown>>>),
 ('__subclasshook__', <function CDispatch.__subclasshook__>),
 ('__weakref__', None),
 ('_builtMethods_', {}),
 ('_enum_', None),
 ('_find_dispatch_type_',
  <bound method CDispatch._find_dispatch_type_ of <COMObject <unknown>>>),
 ('_get_good_object_',
  <bound method CDispatch._get_good_object_ of <COMObject <unknown>>>),
 ('_get_good_single_object_',
  <bound method CDispatch._get_good_single_object_ of <COMObject <unknown>>>),
 ('_lazydata_',
  (<PyITypeInfo at 0x0000027BCC17B530 with obj at 0x0000027B9A8B33D8>,
   <PyITypeComp at 0x0000027BCC230A20 with obj at 0x0000027B9A8B3BB8>)),
 ('_make_method_',
  <bound method CDispatch._make_method_ of <COMObject <unknown>>>),
 ('_mapCachedItems_', {}),
 ('_oleobj_',
  <PyIDispatch at 0x0000027BCC17B500 with obj at 0x0000027B9A8B3918>),
 ('_olerepr_', <win32com.client.build.LazyDispatchItem at 0x27bcd7077f0>),
 ('_print_details_',
  <bound method CDispatch._print_details_ of <COMObject <unknown>>>),
 ('_proc_', <bound method CDispatch._proc_ of <COMObject <unknown>>>),
 ('_unicode_to_string_', None),
 ('_username_', '<unknown>'),
 ('_wrap_dispatch_',
  <bound method CDispatch._wrap_dispatch_ of <COMObject <unknown>>>)]

dir(myData)对我的一点 Python 知识没有任何用处:

['_ApplyTypes_',
 '_FlagAsMethod',
 '_LazyAddAttr_',
 '_NewEnum',
 '_Release_',
 '__AttrToID__',
 '__LazyMap__',
 '__bool__',
 '__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__int__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_builtMethods_',
 '_enum_',
 '_find_dispatch_type_',
 '_get_good_object_',
 '_get_good_single_object_',
 '_lazydata_',
 '_make_method_',
 '_mapCachedItems_',
 '_oleobj_',
 '_olerepr_',
 '_print_details_',
 '_proc_',
 '_unicode_to_string_',
 '_username_',
 '_wrap_dispatch_']

由于调用函数是典型的 MATLAB。

标签: pythonmatlabwin32comole

解决方案


我已经通过一些试验和错误进行了排序:

Matlab myData = oWTX4.CurrentData;
Python myData = wintax.CurrentData(0)

Matlab myDataLoad = invoke(myData, 'Item', 0);
Python myDataLoad = wintax.CurrentData.Item(0)

Matlab myDataLoadTime = get(myDataLoad, 'Time' );
Python myDataLoadTime = myDataLoad.Time

Matlab MyChannels = get(myDataLoad, 'Channels');
Python MyChannels = myDataLoad.Channels

Matlab MyChannel = invoke(MyChannels, 'Item', 'accx_can')
Python MyChannel = MyChannels.Item(accx_can) 

Matlab MyChannelFreq = get(MyChannel, 'SampleRate')
Python MyChannelFreq = MyChannel.SampleRate

Matlab MyChannelValues = invoke(MyChannel, 'Values', 0, myDataLoadTime);
Python MyChannelValues = MyChannel.Values(0,myDataLoadTime)

MyChannelValues 它是一个浮点数


推荐阅读