Spaces:
Sleeping
Sleeping
deploy at 2024-08-12 17:33:06.979023
Browse files- Dockerfile +10 -0
- README.md +26 -10
- app.py +32 -0
- code_runner.py +14 -0
- config.ini +5 -0
- requirements.txt +2 -0
Dockerfile
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.10
|
2 |
+
WORKDIR /code
|
3 |
+
COPY --link --chown=1000 . .
|
4 |
+
RUN mkdir -p /tmp/cache/
|
5 |
+
RUN chmod a+rwx -R /tmp/cache/
|
6 |
+
ENV HF_HUB_CACHE=HF_HOME
|
7 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
8 |
+
|
9 |
+
ENV PYTHONUNBUFFERED=1 PORT=7860
|
10 |
+
CMD ["python", "main.py"]
|
README.md
CHANGED
@@ -1,10 +1,26 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# PyConsole
|
2 |
+
|
3 |
+
Turn browser into a console for Python using [FastHTML](https://github.com/answerdotai/fasthtml) (in 34 lines).
|
4 |
+
# Usage
|
5 |
+
|
6 |
+
```shell
|
7 |
+
pip install python-fasthtml
|
8 |
+
git clone https://github.com/iamaziz/fh_pyconsole.git
|
9 |
+
cd fh_pyconsole
|
10 |
+
```
|
11 |
+
|
12 |
+
```python
|
13 |
+
python app.py
|
14 |
+
```
|
15 |
+
|
16 |
+
Open browser and navigate to `http://localhost:5001`
|
17 |
+
|
18 |
+
# Demo
|
19 |
+
|
20 |
+
> `<TODO> add screenshare video recording`
|
21 |
+
|
22 |
+
<br>
|
23 |
+
|
24 |
+
## Disclaimer ⚠️
|
25 |
+
|
26 |
+
> Under the hood, `exec()` is used to execute Python code.
|
app.py
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fasthtml.common import (
|
2 |
+
Main, Div, Form, Input, Code, Pre, fast_app, serve, picolink, MarkdownJS, HighlightJS
|
3 |
+
)
|
4 |
+
from fasthtml_hf import setup_hf_backup # to deploy to HF spaces
|
5 |
+
|
6 |
+
from code_runner import execute_code as execute
|
7 |
+
|
8 |
+
app, rt = fast_app(hdrs=[picolink, MarkdownJS(), HighlightJS()])
|
9 |
+
log = []
|
10 |
+
|
11 |
+
|
12 |
+
@app.get("/")
|
13 |
+
def pyconsole():
|
14 |
+
return Main(
|
15 |
+
Div(id="output"),
|
16 |
+
Form(
|
17 |
+
Input(name="code", placeholder=">>> Type Python code here (and hit enter)"),
|
18 |
+
hx_post="/run", hx_target="#output", hx_trigger="submit", id="input_form",
|
19 |
+
),
|
20 |
+
cls="container",
|
21 |
+
hx_swap="innerHTML show:window:bottom", # automatically scroll to the bottom of the page
|
22 |
+
)
|
23 |
+
|
24 |
+
|
25 |
+
@app.post("/run")
|
26 |
+
def run_code(data: dict):
|
27 |
+
log.append((data["code"], execute(data["code"])))
|
28 |
+
return Div(*[Div(Pre(Code(code, klass="python")), Div(output, cls="marked"), Div("---", cls="marked")) for code, output in log])
|
29 |
+
|
30 |
+
|
31 |
+
setup_hf_backup(app)
|
32 |
+
serve()
|
code_runner.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import sys
|
2 |
+
from io import StringIO
|
3 |
+
|
4 |
+
|
5 |
+
def execute_code(code: str):
|
6 |
+
try:
|
7 |
+
old_stdout = sys.stdout
|
8 |
+
redirected_output = sys.stdout = StringIO()
|
9 |
+
exec(code, globals())
|
10 |
+
sys.stdout = old_stdout
|
11 |
+
return redirected_output.getvalue()
|
12 |
+
except Exception as e:
|
13 |
+
return str(e)
|
14 |
+
|
config.ini
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[DEFAULT]
|
2 |
+
dataset_id = space-backup
|
3 |
+
db_dir = data
|
4 |
+
private_backup = True
|
5 |
+
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
python-fasthtml
|
2 |
+
fasthtml-hf
|