C-api: Executing several scripts as __main__: globals are gone

nospam.Hartmut Goebel h.goebel at crazy-compilers.com
Sat Nov 25 17:58:00 EST 2017


Hello,

in PyInstaller we execute several Python scripts one after each other. The
primary use of this is to run some setup prior to the actual appication. Up to
now all scripts shared the same global variables, which worked well for 15
years, but now showed an error. The new code (scratched below) now deletes
sys.modules['__main__'], so the next script will get a fresh module and fresh
globals. This leads to an obscure error:

If a setup-script hooks into something, this hook does not see it's own
script's/module's globals. Thus running the scripts below (setup first, then
main), fails with:

Traceback (most recent call last):
â  File "main-script", line 2, in <module>
â  File "setup-script", line 3, in do_it
NameError: global name 'sys' is not defined

Same effect for any other identifier defined globally in setup-script, e.g
global functions (which is worse then just a missing import).

I tried keeping a reference to the module (to avoid garbage-collection) both in
 the C-code and in the setup-script. But this did not solve the issue, the
effect is the same. I also read through the CPython source but did not spot
anything useful. Additionally, this issue only occurs with Python 2.7 and 3.3,
Python 3.4 and up are okay.

Any ideas?

....8<------ C-code scratch!! pseudo-code --- sys_modules =
PyImport_GetModuleDict(); for each entry in archive {
â â â  data = Get_data_out_of_the_archive()
â â â  code = PyMarshal_ReadObjectFromString(data)
    /* execute as '__main__ for compatibility */
â â â  module = PyImport_ExecCodeModule("__main__", code);
â â â  Py_DECREF(module);
â â â  /* remove '__main__' from sys.modules */
â â â  PyObject_DelItem(sys_modules, "__main__");
}
......8<-----------------------

Now if a have these two scripts (these are examples:

......8<---- setup-script ------
import sys
def do_it()
   print(sys.modules)
sys.do_it = do_it
......8<-------------------------

and

......8<---- main-script ------
import sys
sys.do_it()
......8<-----------------------


--
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel at crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |




More information about the Python-list mailing list