MORE INFO

Cedric Adjih adjih at crepuscule.com
Sun Apr 30 12:45:48 EDT 2000


mdefreitas at sikorsky.com wrote:


>> Do you want to run several python scripts (and several ui.commands
>> C code) concurently (how would you synchronize?) ?

> I do not want to run concurrently, I just want to run in one thread of
> execution, but recursively.

Ok.

>> Note that if all you want is to have C code that calls Python
>> code that calls C code (through a module) that calls Python code
>> without threads, PyRun_XXX functions are re-entrant.

> Thanks! That's what I needed to know. I now modified (and simplified)
> my code as follows:

> void interp(char *script) {
>    static int nest_level = 0;
>    FILE *fd = fopen(script, "r");
>    if (nest_level == 0) {
>       Py_Initialize();
>       PyRun_SimpleString("import ui\n"); // import my ui
>    }
>    nest_level++;
>    PyRun_SimpleFile(fd, script);
>    nest_level--;
>    if (nest_level == 0) Py_Finalize();
> }

> The only problem is that the nested script that is run "remembers" the
> variable settings from it's caller. Is there a way to give each nested
> python script a fresh, clean environment? The nested script should not
> effect the environment of it's caller either. Is that what the global
> and local dictionaries for the API function PyRun_File are for? If so,
> is there any examples on their usage. The C/API doc isn't all that
> explicit.

  Indeed.
  PyRun_File is actually implementing most of the "execfile(...)"
code (see http://www.python.org/doc/current/lib/built-in-funcs.html).
Python source code for execfile is also an example of use for 
PyRun_File.
  Passing empty dictionaries would be a way to have a "clean"
environment except if a script imports a Python module and fiddles
with its internals. Because modules will be shared among scripts.
But fiddling with internals is very bad style.

-- Cedric




More information about the Python-list mailing list