# https://github.com/snehankekre/streamlit-tensorboard/blob/master/streamlit_tensorboard/__init__.py
import streamlit as st
import streamlit.components.v1 as components
from tensorboard import manager
import shlex
import random
import html
import json
import os, signal
def kill_tensorboard():
try:
# iterating through each instance of the process
for line in os.popen("ps ax | grep " + "tensorboard" + " | grep -v grep"):
fields = line.split()
# extracting Process ID from the output
pid = fields[0]
# terminating process
os.kill(int(pid), signal.SIGKILL)
except:
st.info("Error Encountered while running kill script")
def st_tensorboard(logdir="/logs/", port=6006, width=None, height=800, scrolling=True):
"""Embed Tensorboard within a Streamlit app
Parameters
----------
logdir: str
Directory where TensorBoard will look to find TensorFlow event files that it can display.
TensorBoard will recursively walk the directory structure rooted at logdir, looking for .*tfevents.* files.
Defaults to /logs/
port: int
Port to serve TensorBoard on. Defaults to 6006
width: int
The width of the frame in CSS pixels. Defaults to the report’s default element width.
height: int
The height of the frame in CSS pixels. Defaults to 800.
scrolling: bool
If True, show a scrollbar when the content is larger than the iframe.
Otherwise, do not show a scrollbar. Defaults to True.
Example
-------
>>> st_tensorboard(logdir="/logs/", port=6006, width=1080)
"""
logdir = logdir
port = port
width = width
height = height
frame_id = "tensorboard-frame-{:08x}".format(random.getrandbits(64))
shell = """
"""
#args_string = f"--logdir {logdir} --port {port}"
args_string = f"--logdir {logdir} --host localhost"
parsed_args = shlex.split(args_string, comments=True, posix=True)
start_result = manager.start(parsed_args)
if isinstance(start_result, manager.StartReused):
port = start_result.info.port
print(f"Reusing TensorBoard on port {port}")
proxy_url = "http://localhost:%PORT%"
proxy_url = proxy_url.replace("%PORT%", "%d" % port)
replacements = [
("%HTML_ID%", html.escape(frame_id, quote=True)),
("%JSON_ID%", json.dumps(frame_id)),
("%HEIGHT%", "%d" % height),
("%PORT%", "0"),
("%URL%", json.dumps(proxy_url)),
]
for (k, v) in replacements:
shell = shell.replace(k, v)
return components.html(shell, width=width, height=height, scrolling=scrolling)