> > I'm getting crasy about embedding python-win32 in a c++ application.
--snip--

I had the same issue.  Here is the sequence I evolved from both 2.2 and 2.5
implementations (and working in production code although this code IS
just at part of the stuff):


// some tables I use
char *plines[]=
{
    "import sys\n",
    "",
    "@",
    "@\\dlls",
    "@\\libs",
    "@\\win32\\lib",
    "@\\win32",
//  my special stuff was here - notably my DebugWin to catch 
// stdout/stderr and pop them up in a tk window
    NULL
};

// a utility function
char *
doubleup(char *input)
{
    static char ans[MAX_PATH];
    char *a = ans;

    while (*input)
        {
        if (*input == '\\')
            *a++ = '\\';
        *a++ = *input++;
        if (a >= &ans[MAX_PATH-1])
            break;
        }
    *a++=0;     // ensure 0 termination
    return ans;
}


// the fragment from my main where I set things up
// please note..... not every variable is defined in this fragment!!


        p=getenv("PATH");
        if (!p)
        {
                MessageBox(GetDesktopWindow(),
                              "No PATH found!!!","***** Failure",MB_OK);
                exit(4);
        }
        if (strlen(p) >= sizeof(lpath))
        {
                MessageBox(GetDesktopWindow(),"PATH too 
long","*****Failure",MB_OK);
                exit(4);
        }
        strncpy(lpath,"PATH=",sizeof(lpath));
        strncpy(ulpath,p,sizeof(ulpath));
        _strupr(ulpath);
        i=0;
        if (!strstr(ulpath,"mylocalpath\\PYTHON25\\DLLS"))
        {
                i=1;
        }
        strncat(lpath,p,sizeof(lpath));
        strncpy(local,StartupDir,sizeof(local));
        _strupr(local);
        if (!strstr(ulpath,local))
        {
                i |= 2;
        }
        // make sure I come first in paths- 
            // otherwise stupid Windoze can't find some DLLs if the are included
        // by other DLLs since the search path is DIFFERENT than that used by 
            //the first inclusion (usually)

        if (i)
        {
            ulpath[0]=0;
            if (i & 2)
            {   // put me first
                strncat(ulpath,local,sizeof(ulpath);
                strncat(ulpath,";",sizeof(ulpath));
            }
            if (i & 1)
            { // put my local Python dirs at the the beginning of the path!!!!
                
strncat(ulpath,"mylocalpath\\Python25;mylocalpath\\Python25\\DLLs;",
                             sizeof(ulpath));
            }
            strncat(ulpath,lpath,sizeof(ulpath));

            _putenv(lpath);
        }
                
        _putenv("PYTHONHOME=mylocalpath\\Python25");
        _putenv("PYTHONPATH="); // remove from environment - it never worked 
correctly

//using TCL???
        _putenv("TCL_LIBRARY=mylocalpath\\python25\\tcl\\tcl8.4");

// moving on
        // put my startup path here too so I can 'find' modules to import
        strncpy(local,"sys.path.insert(0,   '");
        strcat(local,doubleup(StartupDir));
        strcat(local,"')\n");
        plines[1]=_strdup(local);



// alt this and now we are finally ready to do some "pythoning"

            /* Pass argv[0] to the Python interpreter */
        Py_SetProgramName(filename);    // this is the "startup" filename 
with a path on it

        /* Initialize the Python interpreter.  Required. */
        Py_Initialize();
        // initialize thread support
        PyEval_InitThreads();

// different logic goes in here if if using Python before 2.5

        PySys_SetArgv(1, argvx);        // some array is REQUIRED else error 
on argv !!!!!

// this pre-imports some modules for me 

        for (i=0;plines[i];++i)
        {
            char *pl;
            pl=plines[i];
            if (pl[0] == '@')
            {
                strcpy(local,"sys.path.append('");
                strcat(local,doubleup("mylocalpath\\Python25));
                strcat(local,doubleup(&pl[1]));
                strcat(local,"')\n");
                pl=local;   
            }
            // execute some python code
            emsg[0]=0;
            if (PyRun_SimpleString(pl) == -1)
            {

                PyErr_Fetch (&ptype, &pvalue, &ptrace);

                sprintf(local,"err on %s \n\n%s",plines[i],emsg);
                MessageBox(NULL,local,"Error",MB_OK );
            }
        }

// this point, the interpreter is working and has had some basic modules 
imported

// I have callbacks from python into my C++ code so....
            PyImport_AddModule("pyaccess");
           Py_InitModule("pyaccess", pyaccess_methods);

// start me up
        ans=PyRun_SimpleString("import mymainpythonmodule\n");

// note that all my Python code actually runs in this import 
(mymainpythonmodule)
// but something else could run/rerun at this point

_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to