| import streamlit as st |
| import os |
| import sys |
| import subprocess |
| import shlex |
| from datetime import datetime |
|
|
| def save(s: subprocess.CompletedProcess): |
| if 'outputs' not in st.session_state: |
| st.session_state['outputs'] = [] |
| st.session_state['outputs'].append({ |
| 'returned_at': datetime.now(), |
| 'args': s.args, |
| 'stdout': str(s.stdout), |
| 'return_code': s.returncode, |
| 'stderr': str(s.stderr), |
| }) |
|
|
| def list_files(startpath): |
| l = [] |
| for root, dirs, files in os.walk(startpath): |
| level = root.replace(startpath, '').count(os.sep) |
| indent = ' ' * 4 * (level) |
| l.append('{}{}/'.format(indent, os.path.basename(root))) |
| subindent = ' ' * 4 * (level + 1) |
| for f in files: |
| l.append('{}{}'.format(subindent, f)) |
| print('{}{}'.format(subindent, f)) |
| return '\n'.join(l) |
|
|
| st.title("๐ Streamlit Shell ๐") |
| with st.expander("diagnostic"): |
| st.code(list_files(os.getcwd())) |
| st.code(f"sys.path: {sys.path}") |
| st.code(f"sys.argv: {sys.argv}" ) |
| st.code(f"sys.executable: {sys.executable}") |
| st.code(f"sys.flags: {sys.flags}") |
|
|
| cmd_txt = st.text_input("command input: ", help='This will call a simple subprocess.run(<input>). The input is best effort parsed by shlex') |
| if cmd_txt and cmd_txt != "": |
| try: |
| s = subprocess.run(shlex.split(cmd_txt), capture_output=True) |
| save(s) |
| if s.returncode!= 0: |
| st.warning(f'non-zero return: {s.returncode}', icon="โ ๏ธ") |
| if s.stdout: |
| st.code(s.stdout.decode()) |
| if s.stderr: |
| st.code(s.stderr.decode()) |
| except Exception as inst: |
| st.error(inst) |
|
|
|
|
| if 'outputs' in st.session_state: |
| st.caption('hint: double click on long outputs') |
| st.dataframe(st.session_state['outputs']) |