File: yexecfile.py

package info (click to toggle)
yade 2025.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,308 kB
  • sloc: cpp: 93,298; python: 50,409; sh: 577; makefile: 162
file content (31 lines) | stat: -rw-r--r-- 1,204 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"Module providing execfile forward compatibility with new python versions"


def execfile(filename, myglobals=None, mylocals=None):
	"""
        Read and execute a Python script from a file in the given namespaces.
        The globals and locals are dictionaries, defaulting to the current
        globals and locals. If only globals is given, locals defaults to it.
        """
	try:
		from collections.abc import Mapping
	except:
		from collections import Mapping
	import inspect
	if myglobals is None:
		# There seems to be no alternative to frame hacking here.
		caller_frame = inspect.stack()[1]
		myglobals = caller_frame[0].f_globals
		mylocals = caller_frame[0].f_locals
	elif mylocals is None:
		# Only if myglobals is given do we set mylocals to it.
		mylocals = myglobals
	if not isinstance(myglobals, Mapping):
		raise TypeError('globals must be a mapping')
	if not isinstance(mylocals, Mapping):
		raise TypeError('locals must be a mapping')
	with open(filename, "rb") as fin:
		source = fin.read()
	code = compile(source, filename, "exec")
	## TODO: maybe try deepcopy of myglobals, mylocals so that execfile does not modify the original globals and locals
	exec(code, myglobals, mylocals)