Convert hex to string
I have some output stored in a string that looks like.. >> x '\x01\xee\x1eo\xc3+\x8b\x83\xfad\xf6E\xaa\x0ea/I\x96\x83\xf5G\xa3\rQ\xfcH\xee\r' According to, http://docs.python.org/lib/typesseq-strings.html, this is "Unsigned Hexidecimal (lowercase)". How can I get this into normal Ascii so that I can read it? thanks. -- http://mail.python.org/mailman/listinfo/python-list
Swig and Python
I am trying to wrap some C code I have. Currently I have something like... defs.h --- typedef unsigned long MY_DIGIT; myapp.c - void MakeDigits(MY_DIGIT digits[]) { } char* GetString(char *inMessage, MY_DIGIT *digit) { char *results; ... ... return results; } ...ok so my interface for swig looks like.. %module MyApp %{ #include "math.h" %} extern void MakeDigits(MY_DIGIT digits[]); extern char* GetString(char *inMessage, MY_DIGIT *digit); %include "cpointer.i" %pointer_functions(MY_DIGIT, digit_array); %include "cmalloc.i" %malloc(int); %free(int); ...Ok, so I have a couple questions. 1) How would I call MakeDigits from python? In the C code I would normally have something like... MY_DIGIT tmp[10]; MakeDigits(tmp); 2) How would I call GetString? Again, in C I would have... char *ptr; char msg[100] = "Hello World"; MY_DIGIT x = 98; ptr = GetString(msg, x); 3) Did I define MY_DIGIT correctly in my SWIG interface file? 4) If I try the following Python code... x = new_digit_array() print x then Python.exe dies...any idea? thanks for the help. I am trying to find my answers int he SWIG docs...either i haven't found it or I didn't understand when I came across it. thanks in the mean time. -- http://mail.python.org/mailman/listinfo/python-list
SWIG - python.exe crash
When I try to print an object in Python, python.exe crashes. Below are my files. defs.h -- typedef unsigned long MY_DIGIT; myapp.c -- void MakeDigits(MY_DIGIT digits[]) { } char* GetString(char *inMessage, MY_DIGIT *digit) { char *results; ... ... return results; } MyApp.i -- %module MyApp %{ #include "math.h" %} extern void MakeDigits(MY_DIGIT digits[]); extern char* GetString(char *inMessage, MY_DIGIT *digit); /* allows for the creation of a MY_DIGIT array */ %inline %{ MY_DIGIT *my_digit_array(int size) { return (MY_DIGIT *) malloc(size * sizeof(int)); } %} ...I have two questions. 1) One, I call MakeDigits which should populate the "digits" array with some values. It seems the first time I try it the digits array is populated. Then if I try to re-use the digits array i get some garbage output. But if I recall MakeDigits...I can then re-use the digits array over and over without anymore problems? Any idea? here is how I was trying it... digits = my_digit_array(10) MakeDigits(digits) 2) When I try to print the "my_digit_array" object, python.exe crashes...below is the code I use to cause this problem: (within python) digits = my_digit_array(10) print digits I am using Python 2.4.1, Swig 1.3.25 on Win XP Pro. I tried sending a message on the SWIG mailing list...but so far it hasn't shown up on the list...I've sent it three times now. I'll keep trying. -- http://mail.python.org/mailman/listinfo/python-list
Call C functions from Python
Is there some other way, besides SWIG, which will allow me to call functions inside an Ansi C DLL? Example (C): defs.h --- typedef unsigned long MY_DIGIT; myapp.c - #include "defs.h" char *DoSomeStuff(char *input, MY_DIGIT *digits) { ... } ..thats an example of something I would like to call from Python. -- http://mail.python.org/mailman/listinfo/python-list
Re: Call C functions from Python
ok i got ctypes...now i try >> from ctypes import * >> myApp = CDLL("C:\\myapp.dll") ..now how can I call functions on in myapp.dll? From the tutorial I am not sure..i try, dir(cdll.myApp) and dir(myApp)..but don't see my functions listed. thanks Grant Edwards wrote: > On 2005-10-04, Java and Swing <[EMAIL PROTECTED]> wrote: > > > Is there some other way, besides SWIG, which will allow me to call > > functions inside an Ansi C DLL? > > ctypes > > -- > Grant Edwards grante Yow! Now KEN and BARBIE > at are PERMANENTLY ADDICTED to >visi.comMIND-ALTERING DRUGS... -- http://mail.python.org/mailman/listinfo/python-list
Re: Call C functions from Python
I used, myApp = CDLL("C:...") ...as I saw it in one of the ctypes samples. Anyhow, I tried... myApp = cdll.LoadLibrary("C:\\myapp.dll") myApp.AddNumbers(1, 4) ..I get an error... AttributeError: function 'AddNumbers' not found ...myapp certainly has AddNumbers. Grant Edwards wrote: > On 2005-10-04, Java and Swing <[EMAIL PROTECTED]> wrote: > > ok i got ctypes...now i try > > > >>> from ctypes import * > >>> myApp = CDLL("C:\\myapp.dll") > > I've never seen that sort of usage before. I don't know what > CDLL does, and I can't find it in the docs anywhere. > > Based on my reading of the tutorial, I would have tried eitehr > > myApp = cdll.myapp > or > myApp = cdll.LoadLibrary("C:/myapp.dll") > > > ..now how can I call functions on in myapp.dll? From the > > tutorial I am not sure.. > > Assuming CDLL did something equivalent to cdll.LoadLibrary(), > I'd try: > >myApp.FuncName() > > I've always done it the way it's done in the tutorial: > > mylib = windll.Lib_Name > mylib.myFuncName() > > > i try, dir(cdll.myApp) and dir(myApp)..but don't see my > > functions listed. > > I don't think dir() works on dll's like that. I certainly > don't see it mentioned in the tutorial. What happened when you > tried calling the function the way the tutorial does? > > myapp = cdll.myapp > myapp.MyFunc() > > -- > Grant Edwards grante Yow! Yow! Is my fallout > at shelter termite proof? >visi.com -- http://mail.python.org/mailman/listinfo/python-list
question about output
i have printed out some numbers and they look like 10944800e 10952560d ...if i want to later assign this type of number to variable how can i do it? for example i can't do... >> x = 10944800e ..since it says "invalid token" on the "e". thanks. -- http://mail.python.org/mailman/listinfo/python-list
Re: Call C functions from Python
i tried... >> from ctypes import * >> myapp = cdll.LoadLibrary("c:\\myapp.dll") >> dumpbin /exports myapp.pyd i get, SyntaxError: invalid syntax with it pointing at the first "p" in myapp.pyd. -- http://mail.python.org/mailman/listinfo/python-list
Re: question about output
doh! nevermind, my original output had e and d in it. -- http://mail.python.org/mailman/listinfo/python-list
Re: Call C functions from Python
i dont have a myapp.pyd ...i have myapp.c, or are u suggesting I dump the dll? or the swig generated python file? the swig generated python file only has .py and .pyc. -- http://mail.python.org/mailman/listinfo/python-list
Swig and pointers
I've tried sending a email to the swig mailing list 3 times...but it never seems to get it...not sure what is going on, still looking into it. Until then... I now have a C function such as... int doIt(char *a, MY_DIGIT **digit) { ... } so I am trying to figure out how to pass in that "digit" pointer. My SWIG interface file looks like... extern int doIt(char *a, MY_DIGIT **digit); %include cpointer.i %pointer_functions(MY_DIGIT, md_prt); %typemap(in) (char *a, MY_DIGIT **argv) { /* Check if is a list */ if (PyList_Check($input)) { int i; $1 = PyList_Size($input); $2 = (MY_DIGIT **) malloc(($1+1)*sizeof(long *)); for (i = 0; i < $1; i++) { PyObject *o = PyList_GetItem($input,i); if (PyString_Check(o)) $2[i] = PyString_AsString(PyList_GetItem($input,i)); else { PyErr_SetString(PyExc_TypeError,"list must contain strings"); free($2); return NULL; } } $2[i] = 0; } else { PyErr_SetString(PyExc_TypeError,"not a list"); return NULL; } } %typemap(freearg) (char *a, MY_DIGIT **argv) { free((MY_DIGIT *) $2); } ..from Python I am trying >> ptr = [] >> doIt("blah", ptr) I thought this was the correct approach as described here: http://www.swig.org/Doc1.3/SWIGDocumentation.html#Python_nn59 However, python comes back and says "TypeError: argument number 2: a 'MY_DIGIT **' is expected, 'list([])' is received" ..any ideas? Thanks for all the help. The python community has been great. -- http://mail.python.org/mailman/listinfo/python-list
Re: Swig and pointers
im sorry, why would it be md_ptr? what is md_ptr? i tried.. %include cpointer.i %pointer_functions(MY_DIGIT, digit_ptr) ptr = new_digit_ptr() doIt("a message", ptr) ...doesnt work..still needs a DIGIT ** -- http://mail.python.org/mailman/listinfo/python-list
Re: Swig and pointers
(reposting, i was just told how I should properly reply via groups.google.com) im sorry, why would it be md_ptr? what is md_ptr? i tried.. %include cpointer.i %pointer_functions(MY_DIGIT, digit_ptr) ptr = new_digit_ptr() doIt("a message", ptr) ...doesnt work..still needs a DIGIT ** Miki Tebeka wrote: > Hello Java, > > > ... > > extern int doIt(char *a, MY_DIGIT **digit); > > %include cpointer.i > > %pointer_functions(MY_DIGIT, md_prt); > Don't you mean md_ptr? > > > %typemap(in) (char *a, MY_DIGIT **argv) { > > /* Check if is a list */ > > if (PyList_Check($input)) { > > int i; > > $1 = PyList_Size($input); > > $2 = (MY_DIGIT **) malloc(($1+1)*sizeof(long *)); > > for (i = 0; i < $1; i++) { > > PyObject *o = PyList_GetItem($input,i); > > if (PyString_Check(o)) > > $2[i] = PyString_AsString(PyList_GetItem($input,i)); > > else { > > PyErr_SetString(PyExc_TypeError,"list must contain strings"); > > free($2); > > return NULL; > > } > > } > > $2[i] = 0; > > } else { > > PyErr_SetString(PyExc_TypeError,"not a list"); > > return NULL; > > } > > } > > > > %typemap(freearg) (char *a, MY_DIGIT **argv) { > > free((MY_DIGIT *) $2); > > } > > > > > > ..from Python I am trying > > > > >> ptr = [] > > >> doIt("blah", ptr) > > > > I thought this was the correct approach as described here: > > http://www.swig.org/Doc1.3/SWIGDocumentation.html#Python_nn59 > > > > However, python comes back and says "TypeError: argument number 2: a > > 'MY_DIGIT **' is expected, 'list([])' is received" > > > > ..any ideas? > Didn't check it but from http://www.swig.org/Doc1.3/Library.html it looks > like you need to do: > ptr = new_md_prt() > > HTH. > -- > > Miki Tebeka <[EMAIL PROTECTED]> > http://tebeka.bizhat.com > The only difference between children and adults is the price of the toys -- http://mail.python.org/mailman/listinfo/python-list
SWIG + print value of pointer
I am using SWIG to wrap a C application for use in Python. C code == // returns a pointer to an array of long values in the string, "input" // MY_DIGIT is a typedef such as, typedef unsigned long MY_DIGIT; MY_DIGIT *Split(char *input) { ... } ..I build a DLL named, _MyApp.dll SWIG interface == %module MyApp extern MY_DIGIT *Split(char *input, char *delimiters); %include cpointer.i %pointer_functions(MY_DIGIT, md_ptr); Python = >> from MyApp import * >> msg = "5,7,1,0,4,6,9" >> delims = "," >> results = Split(msg, delims) >> str(results) '_401ba700_p_MY_DIGIT' >> repr(results) '' >> print results ...when I print "results" python.exe crashes ...any idea why it crashes? Why can't I print it? FYI, if it matters, I do the same steps in the main method of my C code and there is no problem. thanks. -- http://mail.python.org/mailman/listinfo/python-list
Help creating extension for C function
I need to write an extension for a C function so that I can call it from python. C code (myapp.c) == typedef unsigned long MY_LONG; char *DoStuff(char *input, MY_LONG *x) { ... } so you pass in a string and an array of MY_LONGS...such as MY_LONGS vals[10] = {}; char *input = "this is my input"; char *result; result = DoStuff(input, vals); ...I need to create an extension so that I can call this from Python such as... >> import myapp >> vals = [1,2,3,4,5,6,7,8,9,10] >> input = "this is my input" >> result = myapp.DoStuff(input, vals) >> print result ideally the result would be a String, vals would be a list and input would be a string. I was hoping to follow along with how to write an extension, as shown here http://docs.python.org/ext/contents.html. ...but a better example would help. Thanks. -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
So is "module.c" a new C file or do I add it to my existing, myapp.c? Fredrik Lundh wrote: > >seq = PySequence_Fast(data, "expected a sequence"); > >if (!seq) > >return NULL; > > here's some more information on the PySequence_Fast API: > > http://www.effbot.org/zone/python-capi-sequences.htm > > -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
also, I noticed you did python build-ext does that mean for any computer I want to run myapp on, I need to build the extension on it as well? Or can I build it once and just copy the files to another computer that has python already installed? If I just copy files, which files and where would they go? Thanks! Java and Swing wrote: > So is "module.c" a new C file or do I add it to my existing, myapp.c? > > > Fredrik Lundh wrote: > > >seq = PySequence_Fast(data, "expected a sequence"); > > >if (!seq) > > >return NULL; > > > > here's some more information on the PySequence_Fast API: > > > > http://www.effbot.org/zone/python-capi-sequences.htm > > > > -- http://mail.python.org/mailman/listinfo/python-list
Wrapper function
I am having trouble with a wrapper function... My C code looks like --- #include #include #include "Python.h" int doStuff(const char *input, const char *d) {...} PyObject *wrap_doStuff(PyObject *, PyObject *args) { int result; char *input = 0; char *d = 0; int ok = PyArg_ParseTuple(args, "ss", &input, &d); if (!ok) return 0; result = doStuff(input, d); return PyBuildValue("i", result); } ...when I try to compile this I get "error C2055: expected formal parameter list, not a type list" and it points to line 31...which is the line "PyObject *wrap_doStuff(...)". I am learning based on the following link: http://wiki.cacr.caltech.edu/danse/index.php/Lots_more_details_on_writing_wrappers any ideas? Note, if I remove the wrapper function, it compiles fine (so its not an issue with Python.h...i don't think), also I am using Visual C++ 6 on Win xp. thanks. -- http://mail.python.org/mailman/listinfo/python-list
Re: Wrapper function
Diez, yes you were right! But I have other problems now. I now have... #include #include #include "Python.h" int doStuff(const char *input, const char *d) {...} static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { int result; char *input = 0; char *d = 0; int ok = PyArg_ParseTuple(args, "ss", &input, &d); if (!ok) return 0; result = doStuff(input, d); return PyBuildValue("i", result); } static PyMethodDef myMethods[] = { {"PyDoStuff", wrap_doStuff, METH_VARARGS, "some documentation"}, {NULL, NULL} }; extern PyMODINIT_FUNC initMyDLL(void) { Py_InitModule4( "MyDLL", myMethods, "my doStuff function", NULL, PYTHON_API_VERSION ); } When I compile, I get two warnings..which are ok. Then when I build my DLL I get.. Linking... Creating library Release/MyDLL.lib and object Release/MyDLL.exp test.obj : error LNK2001: unresolved external symbol _PyBuildValue Release/MyDLL.dll : fatal error LNK1120: 1 unresolved externals Error executing link.exe. MyDLL.dll - 2 error(s), 0 warning(s) ..Any ideas? Diez B. Roggisch wrote: > > PyObject *wrap_doStuff(PyObject *, PyObject *args) { > ^ > I guess you need a parameter name here > > > Diez -- http://mail.python.org/mailman/listinfo/python-list
Re: Wrapper function
So, I write the C code...as shown previously. Then, I do something like... c:\> python >> from distutils.core import setup, Extension >> >>setup( >>name="DLLTester", >>ext_modules = [Extension("DLLTester", ["test.c"])] >>) c:\> python setup.py build_ext -i ..is that it? If so, then it's ok that I get those 2 errors when trying to build in visual c++? thanks Robert Kern wrote: > Java and Swing wrote: > > > When I compile, I get two warnings..which are ok. Then when I build my > > DLL I get.. > > > > Linking... > >Creating library Release/MyDLL.lib and object Release/MyDLL.exp > > test.obj : error LNK2001: unresolved external symbol _PyBuildValue > > Release/MyDLL.dll : fatal error LNK1120: 1 unresolved externals > > Error executing link.exe. > > > > MyDLL.dll - 2 error(s), 0 warning(s) > > > > ..Any ideas? > > Are you using distutils to build your extension module? You should be. > > -- > Robert Kern > [EMAIL PROTECTED] > > "In the fields of hell where the grass grows high > Are the graves of dreams allowed to die." > -- Richard Harter -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
Fredrik, I now have this. myapp.c #include #include #include "Python.h" int doStuff(const char *input, const char *d) { ... } static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { // get the arguments from Python int result; char *input = 0; char *d = 0; int ok = PyArg_ParseTuple(args, "ss", &input, &d); if (!ok) return 0; // make the function call result = doStfuff(input, d); // return the result return PyBuildValue("i", result); } static PyMethodDef functions[] = { {"PyDoStuff", wrap_doStuff, METH_VARARGS, "some documentation"}, {NULL, NULL} }; extern PyMODINIT_FUNC initDLLTester(void) { Py_InitModule4( "DLLTester", functions, "my doStfuff function", NULL, PYTHON_API_VERSION ); } ...when I try to compile in Visual C++ 6, I get Linking... Creating library Release/DLLTester.lib and object Release/DLLTester.exp test.obj : error LNK2001: unresolved external symbol _PyBuildValue Release/DLLTester.dll : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Any ideas what's happening here? DLLTester.dll - 2 error(s), 0 warning(s) Fredrik Lundh wrote: > Java and Swing wrote: > > > So is "module.c" a new C file or do I add it to my existing, myapp.c? > > it's a complete module. if you want it to do something other than printing > the arguments, replace the "do stuff" section with your own code. if you > want to call it something else, rename it. if you want to change the API, > change it. it's not that large; you should be able to figure out what it does > and how it does it in no time at all. > > -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
..ok I modified wrap_doStuff, so it just returns 0 instead of return PyBuildValuethis fixed the problems I had with compiling. however, when I try using it in Python..I get a SystemError: error return without exception set. Anyhow, I need PyBuildValue to work. One other note, the VC++ 6 compiler gives two warnings, one of which is... "warning C4013: 'PyBuildValue' undefined; assuming extern returning int" thanks. >> from DLLTester import * >> x = doStuff("1,2,3,4,5", ",") >> Java and Swing wrote: > Fredrik, > I now have this. > > myapp.c > > #include > #include > #include "Python.h" > > int doStuff(const char *input, const char *d) { ... } > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > // get the arguments from Python > int result; > char *input = 0; > char *d = 0; > int ok = PyArg_ParseTuple(args, "ss", &input, &d); > if (!ok) return 0; > > // make the function call > result = doStfuff(input, d); > > // return the result > return PyBuildValue("i", result); > } > > static PyMethodDef functions[] = > { > {"PyDoStuff", wrap_doStuff, METH_VARARGS, "some documentation"}, > {NULL, NULL} > }; > > extern PyMODINIT_FUNC initDLLTester(void) > { > Py_InitModule4( > "DLLTester", functions, "my doStfuff function", NULL, > PYTHON_API_VERSION > ); > > } > > ...when I try to compile in Visual C++ 6, I get > > Linking... >Creating library Release/DLLTester.lib and object > Release/DLLTester.exp > test.obj : error LNK2001: unresolved external symbol _PyBuildValue > Release/DLLTester.dll : fatal error LNK1120: 1 unresolved externals > Error executing link.exe. > > Any ideas what's happening here? > > DLLTester.dll - 2 error(s), 0 warning(s) > > Fredrik Lundh wrote: > > Java and Swing wrote: > > > > > So is "module.c" a new C file or do I add it to my existing, myapp.c? > > > > it's a complete module. if you want it to do something other than printing > > the arguments, replace the "do stuff" section with your own code. if you > > want to call it something else, rename it. if you want to change the API, > > change it. it's not that large; you should be able to figure out what it > > does > > and how it does it in no time at all. > > > > -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
Carsten..thanks so much...that was it! DUH! Carsten Haese wrote: > On Tue, 2005-10-11 at 15:14, Java and Swing wrote: > > Anyhow, I need PyBuildValue to work. > > Try Py_BuildValue. > > HTH, > > Carsten Haese. -- http://mail.python.org/mailman/listinfo/python-list
Re: Help creating extension for C function
quick question...how about returning an array of longs? ..or in my case I have a pointer to an array of longs. Thanks Carsten Haese wrote: > On Tue, 2005-10-11 at 15:14, Java and Swing wrote: > > Anyhow, I need PyBuildValue to work. > > Try Py_BuildValue. > > HTH, > > Carsten Haese. -- http://mail.python.org/mailman/listinfo/python-list
C Extension - return an array of longs or pointer?
Hi, I have been posting about writing a C extension for Python...so far, so good. At least for the "simple" functions that I need to wrap. Ok, my c function looks like... MY_NUM *doNumberStuff(const char *in, const char *x) { ... } MY_NUM is defined as, typedef unsigned long MY_NUM; (not sure if that matters, or can i just create a wrapper which handles longs?) anyhow..for my wrapper I have this.. static PyObject *wrap_doNumberStuff(PyObject *self, PyObject args) { char *in = 0; char *x = 0; long *result = 0; int ok = PyArg_ParseTuple(args, "ss", &in, &x); if (!ok) return 0; result = doNumberStuff(in, x); return Py_BuildValue("l", result); } ...my question is...in the c code, result is a pointer to an array of longs, how can I get the returned result to be a list or something similar to an array in Python? ...I also have a function which returns a character array (denoted by a char *)...would it work the same as the previous question? Thanks!! -- http://mail.python.org/mailman/listinfo/python-list
C Wrapper Function, crashing Python?
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { // this will store the result in a Python object PyObject *finalResult; // get arguments from Python char *result = 0; char *in= 0; char *aString = 0; char *bString = 0; MY_NUM *a; MY_NUM *b; int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); if (!ok) return 0; // do work to get a and b // count - returns an int; GetVal - returns a char * a = GetVal(aString, count(aString, ",")); b = GetVal(bString, count(bString, ",")); // make function call, which returns a char * result = doStuff(in, a, b); // save result in Python string finalResult = PyString_FromString(result); // free memory PyMem_Free(result); PyMem_Free(a); PyMem_Free(b); // return the result as a Python string return finalResult; } ...from python I can call this function 4 times...works fine. WHen I call it for the fifth time python.exe crashes. im thinking some memory problem in the wrapper function perhaps...but I am not sure. The actually C function, doStuff can be called 5, 6,7...N times without a problem so i know its gotta be my wrapper. Any ideas? Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: C Extension - return an array of longs or pointer?
Interesting...thanks. Any good tutorials out there, other than the python doc for ext? thanks. Brandon K wrote: > All the veteran programmers out there can correct me, but the way I did > it in my extension was this: > > static PyObject *wrap_doNumberStuff(PyObject* self, PyObject* args) > { > char* in = 0; > char* x = 0; > long* result = 0; > int i = 0; > PyObject* py = PyTuple_New() > int ok = PyArg_ParseTuple(args,"ss",&in, &x); > if(!ok) return NULL; > > result = doNumberStuff(in,x): > len = sizeof(result)/sizeof(long) > for(i;i < len; i++) > PyTuple_SET_ITEM(py, i,Py_BuildValue("l",*result[i]) > } > > Simple enough idea...i'm not quite sure if I've done everything > correctly with the pointers, but I'm sure you can figure that out, the > algorithm is simple enough. > > > Hi, > >I have been posting about writing a C extension for Python...so far, > > so good. At least for the "simple" functions that I need to wrap. > > > > Ok, my c function looks like... > > > > MY_NUM *doNumberStuff(const char *in, const char *x) { ... } > > > > MY_NUM is defined as, typedef unsigned long MY_NUM; (not sure if that > > matters, or can i just create a wrapper which handles longs?) > > > > anyhow..for my wrapper I have this.. > > > > static PyObject *wrap_doNumberStuff(PyObject *self, PyObject args) { > > char *in = 0; > > char *x = 0; > > long *result = 0; > > int ok = PyArg_ParseTuple(args, "ss", &in, &x); > > if (!ok) return 0; > > > > result = doNumberStuff(in, x); > > > > return Py_BuildValue("l", result); > > } > > > > ...my question is...in the c code, result is a pointer to an array of > > longs, how can I get the returned result to be a list or something > > similar to an array in Python? > > > > ...I also have a function which returns a character array (denoted by a > > char *)...would it work the same as the previous question? > > > > Thanks!! > > > > > == Posted via Newsgroups.com - Usenet Access to over 100,000 Newsgroups > == > Get Anonymous, Uncensored, Access to West and East Coast Server Farms! > == Highest Retention and Completion Rates! HTTP://WWW.NEWSGROUPS.COM > == -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
update: if I use C's free(result), free(a) free(b) instead of PyMem_Free...I only get one successfuly use/call of doStuff. i.e. // this works doStuff(...) // python crashes here doStuff(...) Java and Swing wrote: > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > // this will store the result in a Python object > PyObject *finalResult; > > // get arguments from Python > char *result = 0; > char *in= 0; > char *aString = 0; > char *bString = 0; > MY_NUM *a; > MY_NUM *b; > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > if (!ok) return 0; > > // do work to get a and b > // count - returns an int; GetVal - returns a char * > a = GetVal(aString, count(aString, ",")); > b = GetVal(bString, count(bString, ",")); > > // make function call, which returns a char * > result = doStuff(in, a, b); > > // save result in Python string > finalResult = PyString_FromString(result); > > // free memory > PyMem_Free(result); > PyMem_Free(a); > PyMem_Free(b); > > // return the result as a Python string > return finalResult; > } > > ...from python I can call this function 4 times...works fine. WHen I > call it for the fifth time python.exe crashes. im thinking some memory > problem in the wrapper function perhaps...but I am not sure. The > actually C function, doStuff can be called 5, 6,7...N times without a > problem > so i know its gotta be my wrapper. > > Any ideas? Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
one more update... if I remove PyMem_Free and free(...) ...so no memory clean up...I can still only call doStuff 4 times, the 5th attemp crashes Python. Java and Swing wrote: > update: > if I use C's free(result), free(a) free(b) instead of PyMem_Free...I > only get one successfuly use/call of doStuff. > > i.e. > // this works > doStuff(...) > > // python crashes here > doStuff(...) > > Java and Swing wrote: > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > // this will store the result in a Python object > > PyObject *finalResult; > > > > // get arguments from Python > > char *result = 0; > > char *in= 0; > > char *aString = 0; > > char *bString = 0; > > MY_NUM *a; > > MY_NUM *b; > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > if (!ok) return 0; > > > > // do work to get a and b > > // count - returns an int; GetVal - returns a char * > > a = GetVal(aString, count(aString, ",")); > > b = GetVal(bString, count(bString, ",")); > > > > // make function call, which returns a char * > > result = doStuff(in, a, b); > > > > // save result in Python string > > finalResult = PyString_FromString(result); > > > > // free memory > > PyMem_Free(result); > > PyMem_Free(a); > > PyMem_Free(b); > > > > // return the result as a Python string > > return finalResult; > > } > > > > ...from python I can call this function 4 times...works fine. WHen I > > call it for the fifth time python.exe crashes. im thinking some memory > > problem in the wrapper function perhaps...but I am not sure. The > > actually C function, doStuff can be called 5, 6,7...N times without a > > problem > > so i know its gotta be my wrapper. > > > > Any ideas? Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
Antoon, I just saw that to. I updated the code like so... static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { // this will store the result in a Python object PyObject *finalResult; // get arguments from Python char *result = 0; char *in= 0; char *aString = 0; char *bString = 0; MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // the array will be 20 long MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // the array will be 20 long int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); if (!ok) return 0; // do work to get a and b // count - returns an int; GetVal - returns a MY_NUM * (a pointer to a MY_NUM array) a = GetVal(aString, count(aString, ",")); b = GetVal(bString, count(bString, ",")); // make function call, which returns a char * result = doStuff(in, a, b); // save result in Python string finalResult = PyString_FromString(result); // free memory PyMem_Free(a); PyMem_Free(b); free(aString); free(bString); free(result); // return the result as a Python string return finalResult; } ..as you can see, i malloc'ed memory, and free'd the memory. However, I still have python crashing (after only 3 successful calls to doStuff). And yes, doStuff is a plain C function...nothing related to Python. Antoon Pardon wrote: > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>: > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > // this will store the result in a Python object > > PyObject *finalResult; > > > > // get arguments from Python > > char *result = 0; > > char *in= 0; > > char *aString = 0; > > char *bString = 0; > > MY_NUM *a; > > MY_NUM *b; > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > if (!ok) return 0; > > > > // do work to get a and b > > // count - returns an int; GetVal - returns a char * > > a = GetVal(aString, count(aString, ",")); > > b = GetVal(bString, count(bString, ",")); > > > > // make function call, which returns a char * > > result = doStuff(in, a, b); > > > > // save result in Python string > > finalResult = PyString_FromString(result); > > > > // free memory > > PyMem_Free(result); > > PyMem_Free(a); > > PyMem_Free(b); > > > > // return the result as a Python string > > return finalResult; > > } > > > > ...from python I can call this function 4 times...works fine. WHen I > > call it for the fifth time python.exe crashes. im thinking some memory > > problem in the wrapper function perhaps...but I am not sure. The > > actually C function, doStuff can be called 5, 6,7...N times without a > > problem > > so i know its gotta be my wrapper. > > > > Any ideas? Thanks! > > Well assuming your doStuff is a C function that knows nothing of python. > it might be the PyMem_Free(result). > http://docs.python.org/api/memoryInterface.html says the following: > > void PyMem_Free(void *p) > Frees the memory block pointed to by p, which must have been > returned by a previous call to PyMem_Malloc() or PyMem_Realloc(). > Otherwise, or if PyMem_Free(p) has been called before, undefined > behavior occurs. If p is NULL, no operation is performed. > > But your result wasn't allocated by a PyMem_Malloc, it was returned > to you by a C function. > > -- > Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
Antoon, I just saw that to. I updated the code like so... static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { // this will store the result in a Python object PyObject *finalResult; // get arguments from Python char *result = 0; char *in= 0; char *aString = 0; char *bString = 0; MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // the array will be 20 long MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // the array will be 20 long int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); if (!ok) return 0; // do work to get a and b // count - returns an int; GetVal - returns a MY_NUM * (a pointer to a MY_NUM array) a = GetVal(aString, count(aString, ",")); b = GetVal(bString, count(bString, ",")); // make function call, which returns a char * result = doStuff(in, a, b); // save result in Python string finalResult = PyString_FromString(result); // free memory PyMem_Free(a); PyMem_Free(b); free(aString); free(bString); free(result); // return the result as a Python string return finalResult; } ..as you can see, i malloc'ed memory, and free'd the memory. However, I still have python crashing (after only 3 successful calls to doStuff). And yes, doStuff is a plain C function...nothing related to Python. Antoon Pardon wrote: > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>: > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > // this will store the result in a Python object > > PyObject *finalResult; > > > > // get arguments from Python > > char *result = 0; > > char *in= 0; > > char *aString = 0; > > char *bString = 0; > > MY_NUM *a; > > MY_NUM *b; > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > if (!ok) return 0; > > > > // do work to get a and b > > // count - returns an int; GetVal - returns a char * > > a = GetVal(aString, count(aString, ",")); > > b = GetVal(bString, count(bString, ",")); > > > > // make function call, which returns a char * > > result = doStuff(in, a, b); > > > > // save result in Python string > > finalResult = PyString_FromString(result); > > > > // free memory > > PyMem_Free(result); > > PyMem_Free(a); > > PyMem_Free(b); > > > > // return the result as a Python string > > return finalResult; > > } > > > > ...from python I can call this function 4 times...works fine. WHen I > > call it for the fifth time python.exe crashes. im thinking some memory > > problem in the wrapper function perhaps...but I am not sure. The > > actually C function, doStuff can be called 5, 6,7...N times without a > > problem > > so i know its gotta be my wrapper. > > > > Any ideas? Thanks! > > Well assuming your doStuff is a C function that knows nothing of python. > it might be the PyMem_Free(result). > http://docs.python.org/api/memoryInterface.html says the following: > > void PyMem_Free(void *p) > Frees the memory block pointed to by p, which must have been > returned by a previous call to PyMem_Malloc() or PyMem_Realloc(). > Otherwise, or if PyMem_Free(p) has been called before, undefined > behavior occurs. If p is NULL, no operation is performed. > > But your result wasn't allocated by a PyMem_Malloc, it was returned > to you by a C function. > > -- > Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
Sorry about the double post... anyhow, after putting in debug statements I found that it was crashing when it called, free(result)so I removed the free(result). now it crashes when it gets to, b = GetVal(bString, count(bString, ",")); ..any ideas? Java and Swing wrote: > Antoon, >I just saw that to. I updated the code like so... > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > // this will store the result in a Python object > PyObject *finalResult; > > // get arguments from Python > char *result = 0; > char *in= 0; > char *aString = 0; > char *bString = 0; > MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > the array will be 20 long > MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > the array will be 20 long > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > if (!ok) return 0; > > // do work to get a and b > // count - returns an int; GetVal - returns a MY_NUM * (a pointer > to a MY_NUM array) > a = GetVal(aString, count(aString, ",")); > b = GetVal(bString, count(bString, ",")); > > // make function call, which returns a char * > result = doStuff(in, a, b); > > // save result in Python string > finalResult = PyString_FromString(result); > > // free memory > PyMem_Free(a); > PyMem_Free(b); > free(aString); > free(bString); > free(result); > > // return the result as a Python string > return finalResult; > } > > ..as you can see, i malloc'ed memory, and free'd the memory. However, > I still have python crashing (after only 3 successful calls to > doStuff). And yes, doStuff is a plain C function...nothing related to > Python. > > > Antoon Pardon wrote: > > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>: > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > > // this will store the result in a Python object > > > PyObject *finalResult; > > > > > > // get arguments from Python > > > char *result = 0; > > > char *in= 0; > > > char *aString = 0; > > > char *bString = 0; > > > MY_NUM *a; > > > MY_NUM *b; > > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > > if (!ok) return 0; > > > > > > // do work to get a and b > > > // count - returns an int; GetVal - returns a char * > > > a = GetVal(aString, count(aString, ",")); > > > b = GetVal(bString, count(bString, ",")); > > > > > > // make function call, which returns a char * > > > result = doStuff(in, a, b); > > > > > > // save result in Python string > > > finalResult = PyString_FromString(result); > > > > > > // free memory > > > PyMem_Free(result); > > > PyMem_Free(a); > > > PyMem_Free(b); > > > > > > // return the result as a Python string > > > return finalResult; > > > } > > > > > > ...from python I can call this function 4 times...works fine. WHen I > > > call it for the fifth time python.exe crashes. im thinking some memory > > > problem in the wrapper function perhaps...but I am not sure. The > > > actually C function, doStuff can be called 5, 6,7...N times without a > > > problem > > > so i know its gotta be my wrapper. > > > > > > Any ideas? Thanks! > > > > Well assuming your doStuff is a C function that knows nothing of python. > > it might be the PyMem_Free(result). > > http://docs.python.org/api/memoryInterface.html says the following: > > > > void PyMem_Free(void *p) > > Frees the memory block pointed to by p, which must have been > > returned by a previous call to PyMem_Malloc() or PyMem_Realloc(). > > Otherwise, or if PyMem_Free(p) has been called before, undefined > > behavior occurs. If p is NULL, no operation is performed. > > > > But your result wasn't allocated by a PyMem_Malloc, it was returned > > to you by a C function. > > > > -- > > Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
ok, further digging...I found that in the C function GetVal...it is crashing where I try to malloc some memory. Note, I have no problems when running this from C..just from Python using my wrapper. GetVal looks something like.. MY_NUM *GetVal(const char *in, const int x) { MY_NUM *results, *returnResults; results = (MY_NUM *) malloc((x * sizeof(MY_NUM) + 1); returnResults = results; // ..do more work.. return returnResults; } I put in print statements into the C code and found that it is crashing at the line where I malloc some space for "results". ...any ideas why this is crashing when calling from Python via C wrapper? Java and Swing wrote: > Sorry about the double post... > > anyhow, after putting in debug statements I found that it was crashing > when it called, free(result)so I removed the free(result). > > now it crashes when it gets to, b = GetVal(bString, count(bString, > ",")); > > ..any ideas? > > Java and Swing wrote: > > Antoon, > >I just saw that to. I updated the code like so... > > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > // this will store the result in a Python object > > PyObject *finalResult; > > > > // get arguments from Python > > char *result = 0; > > char *in= 0; > > char *aString = 0; > > char *bString = 0; > > MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > > the array will be 20 long > > MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > > the array will be 20 long > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > if (!ok) return 0; > > > > // do work to get a and b > > // count - returns an int; GetVal - returns a MY_NUM * (a pointer > > to a MY_NUM array) > > a = GetVal(aString, count(aString, ",")); > > b = GetVal(bString, count(bString, ",")); > > > > // make function call, which returns a char * > > result = doStuff(in, a, b); > > > > // save result in Python string > > finalResult = PyString_FromString(result); > > > > // free memory > > PyMem_Free(a); > > PyMem_Free(b); > > free(aString); > > free(bString); > > free(result); > > > > // return the result as a Python string > > return finalResult; > > } > > > > ..as you can see, i malloc'ed memory, and free'd the memory. However, > > I still have python crashing (after only 3 successful calls to > > doStuff). And yes, doStuff is a plain C function...nothing related to > > Python. > > > > > > Antoon Pardon wrote: > > > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>: > > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > > > // this will store the result in a Python object > > > > PyObject *finalResult; > > > > > > > > // get arguments from Python > > > > char *result = 0; > > > > char *in= 0; > > > > char *aString = 0; > > > > char *bString = 0; > > > > MY_NUM *a; > > > > MY_NUM *b; > > > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > > > if (!ok) return 0; > > > > > > > > // do work to get a and b > > > > // count - returns an int; GetVal - returns a char * > > > > a = GetVal(aString, count(aString, ",")); > > > > b = GetVal(bString, count(bString, ",")); > > > > > > > > // make function call, which returns a char * > > > > result = doStuff(in, a, b); > > > > > > > > // save result in Python string > > > > finalResult = PyString_FromString(result); > > > > > > > > // free memory > > > > PyMem_Free(result); > > > > PyMem_Free(a); > > > > PyMem_Free(b); > > > > > > > > // return the result as a Python string > > > > return finalResult; > > > > } > > > > > > > > ...from python I can call this function 4 times...works fine. WHen I > > > > call it for the fifth time python.exe crashes. im thinking some memory > > > > problem in the wrapper
Re: C Wrapper Function, crashing Python?
thanks for the tip, however even when I do not free aString or bString, i'm still crashing at the malloc in the c function, not the wrapper. Bernhard Herzog wrote: > "Java and Swing" <[EMAIL PROTECTED]> writes: > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > [...] > > char *aString = 0; > > char *bString = 0; > [...] > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > [...] > > free(aString); > > free(bString); > > aString and bString are pointers to memory managed by the strings in > your args tuple. You must not free them! The memory is automatically > managed by Python. > >Bernhard > > -- > Intevation GmbH http://intevation.de/ > Skencil http://skencil.org/ > Thuban http://thuban.intevation.org/ -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
As far as my C Wrapper functions are concerned...I no longer have the need for free(...). I do use PyMem_Free, for structures I allocated by using PyMem_New(...). In my C code I do have things such as... char *foo(const char *in) { char *tmp; tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1); strcpy(tmp, in); ... ... free(tmp); return someValue; } Is that appropriate? I was under the impression that when you malloc memory, you free it when done. I also have things like... char *bar(char *in) { char *results, *finalResults; results = (char *) malloc(...); finalResults = results; while (...) { *results++ = some_val; } return finalResults; } ...is that correct? As I mentioned earlier, when I run these functions from C I have no troubles...I can run them 5, 10, 15 times, etc. From Python, using my wrapper function is when I have trouble. Thanks in advance. Bernhard Herzog wrote: > "Java and Swing" <[EMAIL PROTECTED]> writes: > > > thanks for the tip, however even when I do not free aString or bString, > > i'm still crashing at the malloc in the c function, not the wrapper. > > Do you have any more places where you use free incorrectly? In my > experience, calling free with invalid values can corrupt the data > structures used by the memory allocator in such a way that subsequent > malloc calls crash. > >Bernhard > > -- > Intevation GmbH http://intevation.de/ > Skencil http://skencil.org/ > Thuban http://thuban.intevation.org/ -- http://mail.python.org/mailman/listinfo/python-list
Re: C Wrapper Function, crashing Python?
Bernhard Herzog wrote: > "Java and Swing" <[EMAIL PROTECTED]> writes: > > > char *foo(const char *in) { > > char *tmp; > > tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1); > > strcpy(tmp, in); > > ... > > ... > > free(tmp); > > return someValue; > > } > > > > Is that appropriate? I was under the impression that when you malloc > > memory, you free it when done. > > Looks fine. I hope someValue does not point somewhere into the tmp > buffer, though. someValue doesn't. > > > I also have things like... > > > > char *bar(char *in) { > > char *results, *finalResults; > > results = (char *) malloc(...); > > finalResults = results; > > > > while (...) { *results++ = some_val; } > > > > return finalResults; > > } > > Seems OK, too, assuming the results buffer is big enough. results = (char *) malloc((sizeof(char) * strlen(in) + 1); ..should be big enough. At any rate, it works four times in a row before it fails. I wonder what else or how else to solve this. Why is malloc'ing the memory crashing it!? -- http://mail.python.org/mailman/listinfo/python-list
Pass a tuple (or list) to a C wrapper function
I have a C function which takes an array of long values.. I understand that I can pass a tuple to a C wrapper function and in the C wrapper function have.. int ok = PyArg_ParseTuple(args, "s(ll)", &a, &b, &c); ..that's great if my tuple only contained two longs..but what if it contained 50 would I have to do.. int ok = PyArg_ParseTuple(args, "s(llll)", &a, &b, &c, &d...) ?? how can I handle this? -- http://mail.python.org/mailman/listinfo/python-list
Re: Pass a tuple (or list) to a C wrapper function
Fredrik...I forgot about that...wish Google Groups had a way to quickly find the topics a user posts. anyhow, for receiving an object from python..is it ok = PyArg_ParseTuple(args, "sO", &x, &y); ...is it "sO" or "s0" is it O (as in the letter) or 0 (as in the number)? I would think "O" the letter..but it looks like a zero. thanks Fredrik Lundh wrote: > Jeremy Moles wrote: > > > Probably what you want to do though is just keep the tuple as is and > > iterate over it using the PySequence_* protocol: > > > > http://docs.python.org/api/sequence.html > > I did post a complete and tested example a few days ago, which contained > code that showed how to do this. a complete waste of time, of course. > > -- http://mail.python.org/mailman/listinfo/python-list
Re: Pass a tuple (or list) to a C wrapper function
Fredrik, ...I tried using your code... static long *get_long_array(PyObject *data, int *data_size) { int i, size; long* out; PyObject* seq; seq = PySequence_Fast(data, "expected a sequence"); if (!seq) return NULL; size = PySequence_Size(seq); if (size < 0) return NULL; if (data_size) *data_size = size; out = (long*) PyMem_Malloc(size * sizeof(long)); if (!out) { Py_DECREF(seq); PyErr_NoMemory(); return NULL; } for (i = 0; i < size; i++) out[i] = PyInt_AsLong(PySequence_Fast_GET_ITEM(seq, i)); Py_DECREF(seq); if (PyErr_Occurred()) { PyMem_Free(out); out = NULL; } return out; } and I get this error.. C:\project\myapp.c(549) : error C2040: 'get_long_array' : 'long *(struct _object *,int *)' differs in levels of indirection from 'int ()' any idea? Fredrik Lundh wrote: > Jeremy Moles wrote: > > > Probably what you want to do though is just keep the tuple as is and > > iterate over it using the PySequence_* protocol: > > > > http://docs.python.org/api/sequence.html > > I did post a complete and tested example a few days ago, which contained > code that showed how to do this. a complete waste of time, of course. > > -- http://mail.python.org/mailman/listinfo/python-list
Re: Pass a tuple (or list) to a C wrapper function
I got it. I had get_long_array placed after the method that was calling it.. i.e. void doStuf(...) { x = get_long_array(...); } static long *get_long_array(PyObject *data, int *data_size) { ... } ...I put get_long_array before it in my code..and its fine. Thanks Java and Swing wrote: > Fredrik, > ...I tried using your code... > > static long *get_long_array(PyObject *data, int *data_size) { > int i, size; > long* out; > PyObject* seq; > > seq = PySequence_Fast(data, "expected a sequence"); > if (!seq) > return NULL; > > size = PySequence_Size(seq); > if (size < 0) > return NULL; > > if (data_size) > *data_size = size; > > out = (long*) PyMem_Malloc(size * sizeof(long)); > if (!out) { > Py_DECREF(seq); > PyErr_NoMemory(); > return NULL; > } > > for (i = 0; i < size; i++) > out[i] = PyInt_AsLong(PySequence_Fast_GET_ITEM(seq, i)); > > Py_DECREF(seq); > > if (PyErr_Occurred()) { > PyMem_Free(out); > out = NULL; > } > > return out; > > } > > > and I get this error.. > > C:\project\myapp.c(549) : error C2040: 'get_long_array' : 'long > *(struct _object *,int *)' differs in levels of indirection from 'int > ()' > > any idea? > > Fredrik Lundh wrote: > > Jeremy Moles wrote: > > > > > Probably what you want to do though is just keep the tuple as is and > > > iterate over it using the PySequence_* protocol: > > > > > > http://docs.python.org/api/sequence.html > > > > I did post a complete and tested example a few days ago, which contained > > code that showed how to do this. a complete waste of time, of course. > > > > -- http://mail.python.org/mailman/listinfo/python-list
When to free memory for C wrapper?
I have been posting lately about writing a C wrapper so Python can access my C functions. In my wrapper function I have something like... static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { PyObject *data; char *result; long *d; PyArg_ParseTuple(args, "O:wrap_doStuff", &data); d = get_long_array(data); result = doStuff(d); return PyString_FromString(result); } Now, do I need to use PyMem_Free to free up the "PyObject *data"? Thanks. -- http://mail.python.org/mailman/listinfo/python-list
Re: When to free memory for C wrapper?
One other thing, I was reading about Py_DECREF...and I see it says "A safe approach is to always use the generic operations (functions whose name begins with "PyObject_", "PyNumber_", "PySequence_" or "PyMapping_"). These operations always increment the reference count of the object they return. This leaves the caller with the responsibility to call Py_DECREF() when they are done with the result; this soon becomes second nature." URL: http://www.python.org/doc/api/refcounts.html So does that mean before my C wrapper function exits, or returns I should Py_DECREF any PyObject's I have? For example, in my previous post in this thread..I would have to Py_DECREF(data) right? What if in my wrapper I had static PyObject *wrap_doStuff(...) { PyObject *pyResult; ... pyResult = PyString_FromString(...); return pyResult; } Is PyResult going to be de-referenced or handled automaticlly by python in some way? Or, do I need to somehow call Py_DECREF(pyResult) somewhere..if so, where/when? Thanks! Java and Swing wrote: > I have been posting lately about writing a C wrapper so Python can > access my C functions. > > In my wrapper function I have something like... > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > PyObject *data; > char *result; > long *d; > > PyArg_ParseTuple(args, "O:wrap_doStuff", &data); > > d = get_long_array(data); > > result = doStuff(d); > > return PyString_FromString(result); > } > > Now, do I need to use PyMem_Free to free up the "PyObject *data"? > > Thanks. -- http://mail.python.org/mailman/listinfo/python-list
win32 process information, using win32 extension
i need to get information about the processes running on a windows pc (98, 2k, xp) i can get the pid's using, win32process.EnumProcesses()...and I can get a handle on a process using an id..such as handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, 0, pids[0]) ..but how can i get the name of the process, path to process, etc. I have the win32 extensions (pywin32) on python 2.4. thanks. -- http://mail.python.org/mailman/listinfo/python-list