warped/warp/context.py
2017-04-24 12:25:05 +02:00

50 lines
1.7 KiB
Python

import argparse
import sys
import runpy
from traceback import print_exc
from contextlib import redirect_stdout, redirect_stderr
from multiprocessing import Process
class Context(Process):
def __init__(self, name, path, stdout, stderr, arguments=[], is_module = False, overwritten_modules={}):
super().__init__()
self.name = name
self.stdout = stdout
self.stderr = stderr
self.path = path
self.is_module = is_module
self.arguments = arguments
self.overwritten_modules = overwritten_modules
def run(self):
if self.arguments is not None:
sys.argv = [''] + self.arguments
else:
sys.argv = ['']
sys.modules.update(self.overwritten_modules)
with redirect_stdout(self.stdout):
with redirect_stderr(self.stderr):
try:
if self.is_module:
runpy.run_module(self.path, run_name='__main__')
else:
runpy.run_path(self.path, run_name='__main__')
except Exception:
print_exc(file=sys.stderr)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--path")
parser.add_argument("--arguments", '-a', default=None)
parser.add_argument("--is-module", "-m", default=False, action="store_true", dest="is_module")
args = parser.parse_args()
#newModule = ModuleType('argparse', 'Argument Parser')
#newModule.__dict__.update(argparse.__dict__)
#newModule.__dict__['ArgumentParser'].parse_args = f
print(args)
context = Context("test", args.path, sys.stdout, sys.stderr, None if args.arguments is None else [args.arguments], args.is_module)
context.start()