[Numpy-discussion] NumPy int32 array to Excel through COM server is failing
Raul Cota
raul at virtualmaterials.com
Sat Jan 26 12:56:34 EST 2013
Hello,
We came across a problem trying to get an array across COM when wrapped
as a COM server using the win32com extension.
What caught our attention is that arrays of type float64 work fine but
do not work for any other array.
Does anyone know if there is something we could do at the NumPy level to
make it work ?
Arrays are mapped onto Variant/SafeArray and the conversion to a Variant
seems to be failing for anything that is not a float64.
It is not a huge deal for us to workaround the problem but it is kind of
ugly and I just wanted to make sure there was not something simple that
could be done (particularly if something like this would be considered a
bug).
I include working sample code below that reproduces the problem where
Excel instantiates a com server and requests an array of size and dtype.
On the Python side, the code sets up the com server and exposes the
function that just returns an array of ones.
Code in Excel to get an array:
========================================
Public Sub NumPyVariantTest()
Dim npcom As Object
Dim arr
'... instantiate com object
Set npcom = CreateObject("NPTest.COM")
size = 7
'... test float64. Works !
arr = npcom.GetNPArray(size, "float64")
'... test int32. Fails !
arr = npcom.GetNPArray(size, "int32")
End Sub
========================================
Code in Python to set up com server and expose the GetNPArray function
========================================
import win32com.server.util
import win32com.client
from pythoncom import CLSCTX_LOCAL_SERVER, CLSCTX_INPROC
import sys, os
import numpy
from numpy import zeros, ones, array
class NPTestCOM(object):
"""COM accessible version of CommandInterface"""
_reg_clsid_ = "{A0E551F5-2F22-4FB4-B28E-FF1B6809D21C}"
_reg_desc_ = "NumPy COM Test"
_reg_progid_ = "NPTest.COM"
_reg_clsctx_ = CLSCTX_INPROC
_public_methods_ = ['GetNPArray']
_public_attrs_ = []
_readonly_attrs_ = []
def GetNPArray(self, size, dtype):
""" Return an arbitrary NumPy array of type dtype to check
conversion to Variant"""
return ones(size, dtype=dtype)
if __name__ == '__main__':
import win32com.server.register
import _winreg
dllkey = 'nptestdll'
if len(sys.argv) > 1 and sys.argv[1] == 'unregister':
win32com.server.register.UnregisterClasses(NPTestCOM)
software_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
'SOFTWARE')
vmg_key = _winreg.OpenKey(software_key, 'VMG')
_winreg.DeleteKey(vmg_key, dllkey)
_winreg.CloseKey(vmg_key)
_winreg.CloseKey(software_key)
else:
win32com.server.register.UseCommandLine(NPTestCOM)
software_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
'SOFTWARE')
vmg_key = _winreg.CreateKey(software_key, 'VMG')
_winreg.SetValue(vmg_key, dllkey, _winreg.REG_SZ,
os.path.abspath(os.curdir))
_winreg.CloseKey(vmg_key)
_winreg.CloseKey(software_key)
========================================
Regards,
Raul
--
Raul Cota (P.Eng., Ph.D. Chemical Engineering)
Research & Development Manager
Phone: (403) 457 4598
Fax: (403) 457 4637
Virtual Materials Group - Canada
www.virtualmaterials.com
More information about the NumPy-Discussion
mailing list