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 <[EMAIL PROTECTED]> 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.
>
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to