well, umm, gosh, now i feel quite silly.  that was easy.  okay that's done.

next: i'd like to redirect the output of any "print" statements to my C 
function:

>       void    Log(const unsigned char *utf8_cstrP);

on the mac, python output sys.stdout goes into the debug console if you're in 
the debugger, and to the "console app" if not.  On windows, i don't think it 
goes anywhere at all?

So: i really want it to go to my own log file (via my Log() function).  now, 
can i specify "please output to this FILE*" ?, i looked at all the python c 
headers but found nothing about redirecting the output.

I see "PySys_GetFile()" which will get what it points to, but what i want is a 
"PySys_SetFile()" so i can set it.

the only alternative seems to be:
>       PyObject        *logObjectP = create ???;
>       
>       ERR(PySys_SetObject("stdout", logObjectP));

if that's the only way, how to create the logObjectP such that it redirects the 
write() python function to my Log() C function?

i tried this:
--------------------------------
const char *s_printFunc = 
        "import sys\n"
        "class CustomPrint():\n"
        "       def __init__(self):\n"
        "               self.old_stdout=sys.stdout\n"
        "\n"
        "       def write(self, text):\n"
        "               self.old_stdout.write('foobar')\n"
        "               text = text.rstrip()\n"
        "               if len(text) == 0:\n"
        "                       return\n"
        "               self.old_stdout.write('custom Print--->' + text + 
'\n')\n";

OSStatus        CPython_PreAlloc(const char *utf8Z)
{
        OSStatus                        err = noErr;
        PyCompilerFlags         flags;
        PyObject                        *logObjectP = NULL;
        
        Py_SetProgramName(const_cast<char *>(utf8Z));
        Py_Initialize();

        flags.cf_flags  = PyCF_SOURCE_IS_UTF8;
        logObjectP              = Py_CompileStringFlags(s_printFunc, 
"CustomPrint", Py_single_input, &flags);

        ERR_NULL(logObjectP, tsmUnsupScriptLanguageErr);
        
        if (!err) {
                ERR(PySys_SetObject("stdout", logObjectP));
                ERR(PySys_SetObject("stderr", logObjectP));
                Py_DECREF(logObjectP);
        }
        
        return err;
}

void    CPython_PostDispose()
{
        Py_Finalize();
}

void    CPython_Test()
{
        PyRun_SimpleString(
                "from time import time, ctime\n"
                "print 'Today is', ctime(time())\n");
}

-----------------------------------------
and when i run CPython_Test(), there is no output at all.  If i comment out the 
entire Py_CompileStringFlags() line, then the output works fine (going to 
stdout as expected), so i'm not sure what i'm doing wrong
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to