I just installed 1.0.3.1 on top of Enthought's and asarray() works.

But...
Although the creation of an array from an address via a Dummy class is kosher in one process (as in the previous attachment), it fails across processes - the array is created, but gives a "Python has generated errors" window if the second process even attempts to read.

It can seem to work across processes with mmap.mmap() and tags (used in Windows)

def arrSharedMemory(shape, dtype, tag="PySharedMemory", access=None):
    ## Windows only !  share memory between different
    ## processes if same `tag` is used.
    itemsize = N.dtype(dtype).itemsize
    count = N.product(shape)
    size =  count * itemsize
    import mmap
    sharedmem = mmap.mmap(0, size, tag, access)
    a=N.frombuffer(sharedmem, dtype, count)
    a.shape = shape
    return a

I guess I'll use mmap unless someone can point out otherwise....

Thanks,
Ray
""" nFromAddress.py
"""

##Numeric example, with address kludge
import Numeric, numpy, ctypes, subprocess
from time import clock, sleep

"""a = Numeric.zeros((4), Numeric.Int16)
nAddress = int(repr(.__copy__).split()[-1][:-1], 16)
tmp=(ctypes.c_long*1)(0)
ctypes.memmove(tmp, nAddress+8, 4)
nAddress = tmp[0]
"""

a = numpy.zeros(4, numpy.int16)
nAddress = a.__array_interface__['data'][0]

print nAddress
pid = subprocess.Popen(
    [r'C:\python24\python.exe', 
     ['nFromAddress2.py '+str(nAddress)]
    ]).pid

while clock()<5:
    sleep(.1)
    if a[0]!=0: ## wait for a change...
        print a0[0]

""" nFromAddress.py
"""

import numpy
import time, sys
def fromaddress(address, dtype, shape, strides=None):
    """ Create a numpy array from an integer address, a dtype 
    or dtype string, a shape tuple, and possibly strides.
    """
    # Make sure our dtype is a dtype, not just "f" or whatever.
    dtype = numpy.dtype(dtype)

    class Dummy(object):
        pass
    d = Dummy()
    d.__array_interface__ = dict(
        data = (address, False),
        typestr = dtype.str,
        descr = dtype.descr,
        shape = shape,
        strides = strides,
        version = 3,
    )
    return numpy.asarray(d)


nAddress = sys.argv[1]
print 'recvd addr', nAddress
a3 = fromaddress(nAddress, numpy.int16, (4,))

## any of the following cause a Python/Windows error on access
print a3
#a3[0] = 5
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to