Embedded and extending python 2.5: trouble with __main__ in PyRun_SimpleFileExFlags?

Carl Douglas carl.douglas at gmail.com
Sun Mar 4 20:51:59 EST 2007


I am going to answer this question myself, but perhaps this will be
useful for someone else.  My original C++ code was fine, the
PyRun_SimpleFile was failing due to errors in my python code.  To get
a console and display the python interpreter errors I allocated a
console, and redirected stdout and stderr:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		AllocConsole();
		fpStdOut = freopen( "CONOUT$", "wt", stdout);
		fpStdErr = freopen( "CONOUT$", "wt", stderr);
		fprintf(stdout, "Console opened\n");
		Py_Initialize();
		init_mymodule(); // SWIG generated method
		break;
	case DLL_PROCESS_DETACH:
		fclose(fpStdErr);
		fclose(fpStdOut);
		FreeConsole();
		Py_Finalize();
		break;
	//case DLL_THREAD_ATTACH:
	//case DLL_THREAD_DETACH:
	}
    return TRUE;
}

Then, I can show the Python interpreter errors in the console using
PyErr_Print() in my C++ code:

	// Display the Open dialog box.
	if (GetOpenFileName(&ofn)==TRUE)
	{
		// Thank you:  http://www.ragestorm.net/tutorial?id=21#8
		PyObject* PyFileObject = PyFile_FromString(ofn.lpstrFile, "r");
		if (PyFileObject == NULL)
		{
			PyErr_Print();
			PyErr_Clear();
			return false; // Let the user know the error.
		}

		if (PyRun_SimpleFile(PyFile_AsFile(PyFileObject), ofn.lpstrFile) == -1)
		{
			PyErr_Print();
			PyErr_Clear();
		}

		Py_DECREF(PyFileObject);
	}



On 2/19/07, Carl Douglas <carl.douglas at gmail.com> wrote:
> Hi Python fans,
>
> I am developing a DLL that is loaded by a host application on windows.
>  I'm using python 2.5.
>
> My DLL uses an embedded python interpreter which can access the host
> application through an API which I have exposed using SWIG 1.3.31.
>
> Therefore I have both extended and embedded Python at once: the SWIG
> generated code is statically linked into my DLL, and one of the
> functions in my DLL executes PyRun_SimpleFile.
>
> Using python25_d.dll, I stepped through some python code to understand
> what is happening, and it appears that PyRun_SimpleFile is returning
> -1 because python cannot create the module __main__.
>
> Here's the code from pythonrun.c:
>
> int
> PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
>                         PyCompilerFlags *flags)
> {
>         PyObject *m, *d, *v;
>         const char *ext;
>
>         m = PyImport_AddModule("__main__");
>         if (m == NULL)
>                 return -1;
> .
> .
> .
> }
>
> BTW, PyImport_AddModule fails because deeper down a dictionary check fails:
>
>         if (!PyDict_Check(op))
>                 return NULL;
>
>
> Can someone suggest what I need to do to get this to work?
>
> Here are the relevant lines from my code:
>
>         if (GetOpenFileName(&ofn)==TRUE)
>         {
>                 Py_Initialize();
>                 init_mymodule(); // SWIG generated method
>
>                 PyObject* PyFileObject = PyFile_FromString(ofn.lpstrFile, "r");
>
>                 if (PyRun_SimpleFile(PyFile_AsFile(PyFileObject), ofn.lpstrFile)==-1)
>                 {
>                         MessageBox(NULL, "error running script", "Python", MB_ICONERROR);
>                 }
>
>                 Py_DECREF(PyFileObject);
>
>                 Py_Finalize();
>         }
>
> Thanks.
>



More information about the Python-list mailing list