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