OILS / opy / byterun / execfile.py View on Github | oilshell.org

43 lines, 27 significant
1"""Execute files of Python code."""
2
3import imp
4import os
5import sys
6
7import pyvm2
8
9
10# In Py 2.x, the builtins were in __builtin__
11BUILTINS = sys.modules['__builtin__']
12
13
14def run_code_object(code, args, package=None):
15 # Create a module to serve as __main__
16 old_main_mod = sys.modules['__main__']
17 main_mod = imp.new_module('__main__')
18 sys.modules['__main__'] = main_mod
19 main_mod.__file__ = args[0]
20 if package:
21 main_mod.__package__ = package
22 main_mod.__builtins__ = BUILTINS
23
24 # Set sys.argv and the first path element properly.
25 old_argv = sys.argv
26 old_path0 = sys.path[0]
27 sys.argv = args
28 if package:
29 sys.path[0] = ''
30 else:
31 sys.path[0] = os.path.abspath(os.path.dirname(args[0]))
32
33 vm = pyvm2.VirtualMachine()
34 try:
35 # Execute the source file.
36 pyvm2.run_code(vm, code, f_globals=main_mod.__dict__)
37 finally:
38 # Restore the old __main__
39 sys.modules['__main__'] = old_main_mod
40
41 # Restore the old argv and path
42 sys.argv = old_argv
43 sys.path[0] = old_path0