我希望有人能够帮助我,让我能够从Python进程中对Excel进行马歇尔跨进程调用。
我已经通过使用pythoncom模块的CoMarshalInterfaceInStream()和CoGetInterfaceAndReleaseStream()调用来使Excel会话在Python中初始化,并且当需要从另一个Python进程访问时将保持运行。但是,我需要重复访问流(在我的情况下只能设置一次),而CoGetInterfaceAndReleaseStream()仅允许一次访问接口。
我相信我想实现的可以通过CreateStreamOnHGlobal()、CoMarshalInterface()和CoUnmarshalInterface()来完成,但由于我没有传入正确的参数,所以无法使其正常工作。
与其详细描述我的主要场景,不如我设置一个简单的示例程序,如下所示——显然,这发生在同一个进程中,但是一步一步来!以下代码片段有效:
我已经通过使用pythoncom模块的CoMarshalInterfaceInStream()和CoGetInterfaceAndReleaseStream()调用来使Excel会话在Python中初始化,并且当需要从另一个Python进程访问时将保持运行。但是,我需要重复访问流(在我的情况下只能设置一次),而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)"
有人知道我如何让这个简单的示例工作吗?
提前感谢。