@@ -431,6 +431,7 @@ def _save_subimports(self, code, top_level_dependencies):
431431 Ensure de-pickler imports any package child-modules that
432432 are needed by the function
433433 """
434+
434435 # check if any known dependency is an imported package
435436 for x in top_level_dependencies :
436437 if isinstance (x , types .ModuleType ) and hasattr (x , '__package__' ) and x .__package__ :
@@ -632,7 +633,15 @@ def extract_func_data(self, func):
632633 # save the dict
633634 dct = func .__dict__
634635
635- base_globals = self .globals_ref .get (id (func .__globals__ ), {})
636+ base_globals = self .globals_ref .get (id (func .__globals__ ), None )
637+ if base_globals is None :
638+ # For functions defined in __main__, use vars(__main__) for
639+ # base_global. This is necessary to share the global variables
640+ # across multiple functions in this module.
641+ if func .__module__ == "__main__" :
642+ base_globals = "__main__"
643+ else :
644+ base_globals = {}
636645 self .globals_ref [id (func .__globals__ )] = base_globals
637646
638647 return (code , f_globals , defaults , closure , dct , base_globals )
@@ -1037,7 +1046,11 @@ def _fill_function(*args):
10371046 else :
10381047 raise ValueError ('Unexpected _fill_value arguments: %r' % (args ,))
10391048
1040- func .__globals__ .update (state ['globals' ])
1049+ # Only set global variables that do not exist.
1050+ for k , v in state ['globals' ].items ():
1051+ if k not in func .__globals__ :
1052+ func .__globals__ [k ] = v
1053+
10411054 func .__defaults__ = state ['defaults' ]
10421055 func .__dict__ = state ['dict' ]
10431056 if 'annotations' in state :
@@ -1076,6 +1089,8 @@ def _make_skel_func(code, cell_count, base_globals=None):
10761089 """
10771090 if base_globals is None :
10781091 base_globals = {}
1092+ elif isinstance (base_globals , str ):
1093+ base_globals = vars (sys .modules [base_globals ])
10791094 base_globals ['__builtins__' ] = __builtins__
10801095
10811096 closure = (
0 commit comments