python - 将 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。
解决方案
我已经通过一些试验和错误进行了排序:
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 它是一个浮点数
推荐阅读
- google-rich-snippets - 谷歌 sRich 片段。从 https://schema.org 重定向到 http://schema.org
- r - 这个错误代码在 RStudio 中是什么意思
- javascript - 使用 Vuetify 文件输入组件在 Vue 中使用 js-xlsx 读取 excel 文件
- security - 漏洞扫描程序是否扫描源代码或可执行文件(二进制)?
- linux - 用于以太网自动协商的 Unix 实用程序 Ethtool 的任何 Windows 替代品?
- javascript - Snowpack 配置仅适用于开发或构建,但不能同时适用
- css - 我为生产构建时缺少 Vuetify CSS
- kotlin - Ktor - 由 Application.module 函数中的主函数初始化的访问变量
- git - git如何计算换行?
- rust - 如何为 Rc 实现迭代器
> 链条?