Hi, I'm still working on a program that uses a .dll to read SPSS system files. It's getting somewhere already, but I'm still struggling with one thing. When using the C function spssGetVarNames I'm having trouble translating C arrays to Python lists. I want to translate an array that holds the variable names into a Python list. Same thing for variable types.
The documentation of the SPSSIO dll says the following: spssGetVarNames int spssGetVarNames (int handle, int *numVars, char ***varNames, int **varTypes) Parameter - Description handle - Handle to the data file numVars - Pointer to number of variables varNames - Pointer to array of pointers to variable varTypes - Pointer to array of variable types In the code below, which can also be found on http://pastebin.com/d7d0hpyV, the equivalent Python function is called getVarNamesAndTypes(). This is the output I typically get: retcode: 0 Varnames: ['\x80\xde\x10\x01P\xd8\x10\x01\xf0\xd0\x10\x01', None, None, None, None, None, None, None, None, None] varTypes: [17885264, 0, 0, 0, 0, 0, 0, 0, 0, 0] The first item of each list is clearly wrong, but what does it mean? If varType > 0 it is supposed to be a string var of that length. And of course the varNames are mostly 'None'. Probably, something is wrong with the way the C arrays are initialized, or with the two list comprehensions, but I can't find the solution. varNames = [varNamesPtr[0][i] for i in range(numVars)] does not seem to work. For those who are interested, the complete program can be found on http://pastebin.com/ff1b1Y9a (note that it's still work in progress) Any hints? Thanks very much in advance! import os, ctypes, datetime # dll and py file should be in the same dir! def loadSavFile(fn): os.environ["PATH"] += ";" + os.path.abspath(os.curdir) ctypes.cdll.LoadLibrary("spssio32.dll") spssio = ctypes.windll.spssio32 libc = ctypes.cdll.msvcrt if os.path.exists(fn): fh = libc._fdopen(fn, "rb") fhPtr = ctypes.pointer(ctypes.c_int(fh)) retcode = spssio.spssOpenRead(ctypes.c_char_p(fn), fhPtr) return retcode, spssio, fh else: raise Exception, "File '%s' does not exist!" % fn def getVarNamesAndTypes(fh, spssio): numVarsPtr = ctypes.pointer(ctypes.c_int()) spssio.spssGetNumberofVariables(fh, numVarsPtr) numVars = numVarsPtr[0] varNamesArray = (ctypes.c_char_p * numVars)() varNamesPtr = ctypes.pointer(varNamesArray) varTypesArray = (ctypes.c_int * numVars)() varTypesPtr = ctypes.pointer(varTypesArray) retcode = spssio.spssGetVarNames(fh, numVarsPtr, varNamesPtr, varTypesPtr) varNames = [varNamesPtr[0][i] for i in range(numVars)] # -- WRONG!! varTypes = [varTypesPtr[0][i] for i in range(numVars)] return retcode, varNames, varTypes savFileName = r"C:\Program Files\SPSS\Employee data.sav" retcode, spssio, fh = loadSavFile(savFileName) retcode, varNames, varTypes = getVarNamesAndTypes(fh, spssio) print "retcode:", retcode print "Varnames:", varNames Cheers!! Albert-Jan ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All right, but apart from the sanitation, the medicine, education, wine, public order, irrigation, roads, a fresh water system, and public health, what have the Romans ever done for us? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor