The there command-line interface#
PythonHere can be used from Jupyter through the %there and %%there magics,
or from a terminal through the there CLI. Both connect to the same running
PythonHere application. This page covers the PythonHere-specific CLI workflow
and runtime helpers. See the
Herethere CLI documentation for
the full command reference, connection settings, JSON response fields, and exit
codes.
Connect to the app#
Start PythonHere on the target device, then work from a directory containing a
there.env
connection file, or one of its descendants. Check the installed interface and
target readiness:
there --help
there --json ping
Use --config when the connection file is elsewhere:
there --json --config /path/to/there.env ping
Options for the whole invocation, including --json, --config, --timeout,
and --max-output, go before the command name.
Runtime helpers#
PythonHere’s tools_here module provides helpers for inspecting the live Kivy
application and retrieving rendered output:
runtime_info(app=None, root=None)returns compact runtime metadata.snapshot_ui(widget=None, ...)returns a bounded widget-tree snapshot.save_screenshot(path, widget=None)saves the window or a widget as PNG.encoded_screenshot(widget=None)returns a base64-encoded PNG.pin_shortcut(script, label=None)requests an Android launcher shortcut. Use it only when a shortcut is explicitly wanted; upload the script first.
These helpers can be called from either Kivy’s main thread or a worker thread. A worker call is marshalled to Kivy’s thread and waits for completion. This applies only to these helpers; it does not make arbitrary Kivy operations thread-safe.
Inspect the running application#
runtime_info returns a compact summary of the live application, root widget,
Kivy version, platform, and window size:
there --json get "__import__('tools_here').runtime_info(app, root)"
snapshot_ui returns a bounded, JSON-compatible description of the visible
widget tree:
there --json get "__import__('tools_here').snapshot_ui(root)"
Each widget record includes a structural path, class, text where available, disabled state, geometry, and child count. Snapshot paths describe only that snapshot; they can change after the widget tree changes and should not be used as persistent selectors.
The default snapshot is limited to six levels and 200 visited widgets. When a larger result is needed, raise the soft limits within the helper’s hard ceilings:
there --json get "__import__('tools_here').snapshot_ui(root, max_depth=10, max_widgets=400)"
Check the returned truncated field before assuming the whole tree was
captured. After mounting or changing widgets, inspect them in a later there
request so Kivy has an opportunity to perform layout.
Customize UI records#
Use widget_record_callback when the default snapshot does not include an
application-specific property. For anything beyond a short expression, put the
code in a local UTF-8 file instead of building a long shell command.
For example, save this as inspect_ui.py:
from tools_here import snapshot_ui
def inspect_widget(widget, record):
if hasattr(widget, "value"):
record["value"] = widget.value
return record
pythonhere_ui_snapshot = snapshot_ui(
root,
widget_record_callback=inspect_widget,
)
Run it and retrieve the resulting global:
there --json run inspect_ui.py
there --json get "pythonhere_ui_snapshot"
Capture a screenshot#
Save a PNG in PythonHere’s upload directory, then download it for local visual inspection:
there --json run --code "from tools_here import save_screenshot; save_screenshot('pythonhere-screen.png', root)"
there --json download pythonhere-screen.png ./pythonhere-screen.png
encoded_screenshot(widget=None) is also available when a base64-encoded PNG
is needed directly. Saving and downloading a PNG is usually more convenient for
local inspection.