[capi-sig] Garbage output from warnings with embedded python
Campbell Barton
ideasman42 at gmail.com
Fri May 29 11:41:40 CEST 2009
had another look into it and figured out whats going on, in short for
warnings python wants there to be a file on disk for the script and in
our case there is None, its not getting __file__ from the global
namespace so it gets argv[0] which is the blender3d binary in our
case.
The only fix I found so far was to set the __file__ variable in the
namespace before running the script.
commit log.
http://lists.blender.org/pipermail/bf-blender-cvs/2009-May/019681.html
On Sun, Feb 22, 2009 at 6:45 PM, Campbell Barton <ideasman42 at gmail.com> wrote:
> Still not sure why this happens.
> Did a test with a small C/Python file that just runs external scripts,
> with compiling AND running as a string I don't print gibberish.
>
> So for now I added this to our own warning function...
>
> // import sys; print '\t%s:%d' %
> (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
>
> PyObject *getframe, *frame;
> PyObject *f_lineno, *f_code, *co_filename;
>
> getframe = PySys_GetObject("_getframe"); // borrowed
> if (getframe) {
> frame = PyObject_CallObject(getframe, NULL);
> if (frame) {
> f_lineno= PyObject_GetAttrString(frame,
> "f_lineno");
> f_code= PyObject_GetAttrString(frame, "f_code");
> if (f_lineno && f_code) {
> co_filename=
> PyObject_GetAttrString(f_code, "co_filename");
> if (co_filename) {
>
> printf("\t%s:%d\n",
> PyString_AsString(co_filename),(int)PyInt_AsLong(f_lineno));
>
> Py_DECREF(f_lineno);
> Py_DECREF(f_code);
> Py_DECREF(co_filename);
> Py_DECREF(frame);
> return;
> }
> }
>
> Py_XDECREF(f_lineno);
> Py_XDECREF(f_code);
> Py_DECREF(frame);
> }
>
> }
> PyErr_Clear();
> printf("\tERROR - Could not access
> sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
>
--
- Campbell
More information about the capi-sig
mailing list