handle scripts with arguments

This commit is contained in:
2022-05-11 09:48:53 +02:00
parent 2d4199ccf8
commit 74e39010ef

20
pier.py
View File

@ -25,14 +25,20 @@ from glob import glob
from io import StringIO from io import StringIO
import os import os
import sys
import http.server import http.server
import socketserver import socketserver
HTML_SPACE = "%20"
class ScriptServer(http.server.SimpleHTTPRequestHandler): class ScriptServer(http.server.SimpleHTTPRequestHandler):
def do_GET(self): def do_GET(self):
scr = self.path.strip("/") args = self.path.lstrip("/").split(HTML_SPACE)
scr = args[0]
if not scr.endswith(".py"): if not scr.endswith(".py"):
scr += ".py" scr += ".py"
@ -42,7 +48,7 @@ class ScriptServer(http.server.SimpleHTTPRequestHandler):
self.send_result(f"{scr} does not exist. choose from:\n", printable_scripts) self.send_result(f"{scr} does not exist. choose from:\n", printable_scripts)
return return
res = run_script(scr) res = run_script(scr, args)
msg = f"{scr} output:\n" msg = f"{scr} output:\n"
msg += "_" * 80 msg += "_" * 80
@ -60,11 +66,19 @@ class ScriptServer(http.server.SimpleHTTPRequestHandler):
def run_script(fn): def run_script(fn, args):
sio = StringIO() sio = StringIO()
with redirect_stdout(sio), redirect_stderr(sio): with redirect_stdout(sio), redirect_stderr(sio):
code = open_script(fn) code = open_script(fn)
old_sys_argv, sys.argv = sys.argv, args
try:
exec(code) exec(code)
except BaseException as e: # need to catch SystemExit etc. as well
print("_" * 80)
tn = type(e).__name__
msg = f"{tn}: {e}"
print(msg, file=sys.stderr)
sys.argv = old_sys_argv
return sio.getvalue() return sio.getvalue()
@lru_cache() @lru_cache()