how: embed + extend to control my running app?

David M. Cotter me at davecotter.com
Wed Jul 24 12:10:28 EDT 2013


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



More information about the Python-list mailing list