File size: 2,746 Bytes
e0d6c83
21dcec9
e0d6c83
 
 
 
21dcec9
 
e0d6c83
21dcec9
 
e0d6c83
 
 
 
 
871b360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

---
tags: [gradio-custom-component,gradio-template-Code,logging,subprocess,process]
title: gradio_logsview V0.0.1
colorFrom: gray
colorTo: purple
sdk: docker
pinned: false
license: apache-2.0
---


# Name: gradio_logsview

Description: Visualize logs in your Gradio app

## Installation

```
pip install https://huggingface.co/spaces/Wauplin/gradio_logsview/resolve/main/gradio_logsview-0.0.5-py3-none-any.whl
```

or add this line to your `requirements.txt`:

```
gradio_logsview@https://huggingface.co/spaces/Wauplin/gradio_logsview/resolve/main/gradio_logsview-0.0.5-py3-none-any.whl
```

## How to run Python code?

With `LogsView.run_python`, you can run Python code in a separate process and capture logs in real-time.
You can configure which logs to capture (log level and logger name).

```py
from gradio_logsview import LogsView

def fn_python():
    # Run `my_function` in a separate process
    # All logs above `INFO` level will be captured and displayed in real-time.
    runner = LogsViewRunner() # Initialize the runner
    yield from runner.run_python(my_function, log_level=logging.INFO, arg1="value1")
    yield runner.log(f"Runner: {runner}") # Log any message
    if runner.exit_code != 0:
        # Handle error
        ...

with gr.Blocks() as demo:
    logs = LogsView()
    btn = gr.Button("Run Python code")
    btn.click(fn_python, outputs=logs)
```

## How to run a command?

With `LogsView.run_command`, you can run a command on the system and capture logs from the process in real-time.
    
```py
from gradio_logsview import LogsView

def fn_command():
    # Run a command and capture all logs from the subprocess
    runner = LogsViewRunner() # Initialize the runner
    yield from runner.run_command(
        cmd=["mergekit-yaml", "config.yaml", "merge", "--copy-", "--cuda", "--low-cpu-memory"]
    )
    yield runner.log(f"Runner: {runner}") # Log any message
    if runner.exit_code != 0:
        # Handle error
        ...

with gr.Blocks() as demo:
    logs = LogsView()
    btn = gr.Button("Run command")
    btn.click(fn_command, outputs=logs)
```

## TODO

- [ ] display logs with colors (front-end)
- [ ] format logs client-side (front-end)
- [ ] scrollable logs if more than N lines (front-end)
- [ ] format each log only once (front-end)
- [x] stop process if `run_command` gets cancelled (back-end)
- [x] correctly pass error stacktrace in `run_python` (back-end)
- [x] correctly catch print statements in `run_python` (back-end)
- [ ] disable interactivity + remove all code editing logic (both?)
- [x] how to handle progress bars? (i.e when logs are overwritten in terminal)
- [ ] Have 3 tabs in UI for stdout, stderr and logging (front-end + back-end)
- [ ] Write logger name in the logs (back-end)