我希望有人可以帮助我能够从 Python 对 Excel 进行编组跨进程调用。
我有一个通过 Python 启动的 Excel 会话,我知道它会在需要从单独的 Python 进程访问时启动并运行。CoMarshalInterfaceInStream()
使用 pythoncom 模块的编组和调用,我已经让所有工作都按预期工作CoGetInterfaceAndReleaseStream()
,但我需要重复访问流(在我的情况下我只能设置一次),并CoGetInterfaceAndReleaseStream()
允许对接口进行一次访问。
我相信我想实现的目标可以用 来完成CreateStreamOnHGlobal()
,CoMarshalInterface()
但CoUnmarshalInterface()
我无法让它工作,几乎可以肯定是因为我没有传入正确的参数。
我没有详细描述我的主要场景,而是设置了一个简单的示例程序,如下所示 - 显然这发生在同一个过程中,但一次一步!以下代码段工作正常:
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
marshalledExcelApp = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, excelApp)
xlApp = win32com.client.Dispatch(
pythoncom.CoGetInterfaceAndReleaseStream(marshalledExcelApp, pythoncom.IID_IDispatch))
xlWb = xlApp.Workbooks.Add()
xlWs = xlWb.Worksheets.Add()
xlWs.Range("A1").Value = "AAA"
但是,当我尝试以下操作时:
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
myStream = pythoncom.CreateStreamOnHGlobal()
pythoncom.CoMarshalInterface(myStream,
pythoncom.IID_IDispatch,
excelApp,
pythoncom.MSHCTX_LOCAL,
pythoncom.MSHLFLAGS_TABLESTRONG)
myUnmarshaledInterface = pythoncom.CoUnmarshalInterface(myStream, pythoncom.IID_IDispatch)
调用时出现此错误(我想这与第三个参数有关)pythoncom.CoMarshalInterface()
:
"ValueError: argument is not a COM object (got type=instance)"
有谁知道我怎样才能让这个简单的例子工作?
提前致谢