diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 000000000000..76e49aa15754 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +out.rrd diff --git a/examples/python/api_demo/main.py b/examples/python/api_demo/main.py index aff55a99bab8..eb79c9928d14 100755 --- a/examples/python/api_demo/main.py +++ b/examples/python/api_demo/main.py @@ -333,7 +333,8 @@ def main() -> None: ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "api_demo") diff --git a/examples/python/arkitscenes/main.py b/examples/python/arkitscenes/main.py index e05277eff918..9b9e00632539 100755 --- a/examples/python/arkitscenes/main.py +++ b/examples/python/arkitscenes/main.py @@ -431,7 +431,8 @@ def main() -> None: help="Include the high resolution camera and depth images", ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "arkitscenes") recording_path = ensure_recording_available(args.video_id, args.include_highres) diff --git a/examples/python/car/main.py b/examples/python/car/main.py index 8745f064a026..a86bf23c70ec 100755 --- a/examples/python/car/main.py +++ b/examples/python/car/main.py @@ -255,7 +255,8 @@ def generate_car_data(num_frames: int) -> Iterator[SampleFrame]: def main() -> None: parser = argparse.ArgumentParser(description="Logs rich data using the Rerun SDK.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "car") log_car_data() diff --git a/examples/python/clock/main.py b/examples/python/clock/main.py index 1eff8821373c..4501a0ad23db 100755 --- a/examples/python/clock/main.py +++ b/examples/python/clock/main.py @@ -70,7 +70,8 @@ def rotate(angle: float, len: float) -> Tuple[float, float, float]: ) parser.add_argument("--steps", type=int, default=10_000, help="The number of time steps to log") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "clock") log_clock(args.steps) diff --git a/examples/python/colmap/main.py b/examples/python/colmap/main.py index cb83a0e800ea..832d68f89346 100755 --- a/examples/python/colmap/main.py +++ b/examples/python/colmap/main.py @@ -182,7 +182,8 @@ def main() -> None: ) parser.add_argument("--resize", action="store", help="Target resolution to resize images") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] if args.resize: args.resize = tuple(int(x) for x in args.resize.split("x")) diff --git a/examples/python/deep_sdf/main.py b/examples/python/deep_sdf/main.py index 7bc91a827242..94a3fea77595 100755 --- a/examples/python/deep_sdf/main.py +++ b/examples/python/deep_sdf/main.py @@ -204,7 +204,8 @@ def main() -> None: help="Path to a mesh to analyze. If set, overrides the `--mesh` argument.", ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "deep_sdf") diff --git a/examples/python/dicom/main.py b/examples/python/dicom/main.py index 7b35e94baf85..892b43b39434 100755 --- a/examples/python/dicom/main.py +++ b/examples/python/dicom/main.py @@ -74,7 +74,8 @@ def ensure_dataset_downloaded() -> Iterable[Path]: if __name__ == "__main__": parser = argparse.ArgumentParser(description="Logs rich data using the Rerun SDK.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "dicom") dicom_files = ensure_dataset_downloaded() read_and_log_dicom_dataset(dicom_files) diff --git a/examples/python/dna/main.py b/examples/python/dna/main.py index 3294ad7980b9..a2d6603fc7bf 100755 --- a/examples/python/dna/main.py +++ b/examples/python/dna/main.py @@ -6,7 +6,6 @@ `examples/python/dna/main.py` """ -import sys from math import tau import numpy as np @@ -15,8 +14,8 @@ from rerun_demo.util import bounce_lerp, interleave from scipy.spatial.transform import Rotation -# sanity-check since all other example scripts take arguments: -assert len(sys.argv) == 1, f"{sys.argv[0]} does not take any arguments" +_, unknown = __import__("argparse").ArgumentParser().parse_known_args() +[__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.init("DNA Abacus") diff --git a/examples/python/minimal/main.py b/examples/python/minimal/main.py index 2beff431ed9f..92e45a01b000 100755 --- a/examples/python/minimal/main.py +++ b/examples/python/minimal/main.py @@ -2,18 +2,16 @@ """Demonstrates the most barebone usage of the Rerun SDK.""" -import sys import numpy as np import rerun as rr +_, unknown = __import__("argparse").ArgumentParser().parse_known_args() +[__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] + rr.spawn() positions = np.vstack([xyz.ravel() for xyz in np.mgrid[3 * [slice(-5, 5, 10j)]]]).T colors = np.vstack([rgb.ravel() for rgb in np.mgrid[3 * [slice(0, 255, 10j)]]]).astype(np.uint8).T rr.log_points("my_points", positions=positions, colors=colors) - - -# sanity-check since all other example scripts take arguments: -assert len(sys.argv) == 1, f"{sys.argv[0]} does not take any arguments" diff --git a/examples/python/mp_pose/main.py b/examples/python/mp_pose/main.py index c2d91117c631..89de0eb97f59 100755 --- a/examples/python/mp_pose/main.py +++ b/examples/python/mp_pose/main.py @@ -150,7 +150,8 @@ def main() -> None: parser.add_argument("--no-segment", action="store_true", help="Don't run person segmentation.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "mp_pose") video_path = args.video_path # type: str diff --git a/examples/python/multiprocessing/main.py b/examples/python/multiprocessing/main.py index dae502832a6a..4c849bdbf8b0 100755 --- a/examples/python/multiprocessing/main.py +++ b/examples/python/multiprocessing/main.py @@ -25,7 +25,8 @@ def task(title: str) -> None: def main() -> None: parser = argparse.ArgumentParser(description="Test multi-process logging to the same Rerun server") - parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.init("multiprocessing") rr.spawn(connect=False) # this is the viewer that each process will connect to diff --git a/examples/python/multithreading/main.py b/examples/python/multithreading/main.py index eeb6f2ed9f49..35c1a674ed71 100755 --- a/examples/python/multithreading/main.py +++ b/examples/python/multithreading/main.py @@ -22,7 +22,8 @@ def rect_logger(path: str, color: npt.NDArray[np.float32]) -> None: def main() -> None: parser = argparse.ArgumentParser(description="Logs rich data using the Rerun SDK.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "multithreading") diff --git a/examples/python/notebook/cube.ipynb b/examples/python/notebook/cube.ipynb index d04f1be19908..ba5f4d9585b7 100644 --- a/examples/python/notebook/cube.ipynb +++ b/examples/python/notebook/cube.ipynb @@ -177,7 +177,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "STEPS = 100\n", "twists = math.pi * np.sin(np.linspace(0, math.tau, STEPS)) / 4\n", "for t in range(STEPS):\n", diff --git a/examples/python/nyud/main.py b/examples/python/nyud/main.py index da577c687d07..f35cbab3c523 100755 --- a/examples/python/nyud/main.py +++ b/examples/python/nyud/main.py @@ -160,7 +160,8 @@ def download_progress(url: str, dst: Path) -> None: ) parser.add_argument("--subset-idx", type=int, default=0, help="The index of the subset of the recording to use.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "nyud") recording_path = ensure_recording_downloaded(args.recording) diff --git a/examples/python/objectron/main.py b/examples/python/objectron/main.py index f4a8efc60a45..a3b2f1e57684 100755 --- a/examples/python/objectron/main.py +++ b/examples/python/objectron/main.py @@ -283,7 +283,8 @@ def main() -> None: ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "objectron") diff --git a/examples/python/opencv_canny/main.py b/examples/python/opencv_canny/main.py index 05c2b7342f56..0a6acc59851c 100755 --- a/examples/python/opencv_canny/main.py +++ b/examples/python/opencv_canny/main.py @@ -73,7 +73,8 @@ def main() -> None: parser.add_argument("--num-frames", type=int, default=None, help="The number of frames to log") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "opencv_canny") diff --git a/examples/python/plots/main.py b/examples/python/plots/main.py index 5f4d327fd746..065603126952 100755 --- a/examples/python/plots/main.py +++ b/examples/python/plots/main.py @@ -85,7 +85,8 @@ def main() -> None: description="demonstrates how to integrate python's native `logging` with the Rerun SDK" ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "plot") diff --git a/examples/python/raw_mesh/main.py b/examples/python/raw_mesh/main.py index 5978060e0902..8ca94e08501f 100755 --- a/examples/python/raw_mesh/main.py +++ b/examples/python/raw_mesh/main.py @@ -84,7 +84,8 @@ def main() -> None: help="Path to a scene to analyze. If set, overrides the `--scene` argument.", ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "raw_mesh") diff --git a/examples/python/segment_anything/main.py b/examples/python/segment_anything/main.py index ad2069840f54..e55b6611855c 100755 --- a/examples/python/segment_anything/main.py +++ b/examples/python/segment_anything/main.py @@ -181,7 +181,8 @@ def main() -> None: parser.add_argument("images", metavar="N", type=str, nargs="*", help="A list of images to process.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "segment_anything") logging.getLogger().addHandler(rr.LoggingHandler("logs")) diff --git a/examples/python/stable_diffusion/main.py b/examples/python/stable_diffusion/main.py index 9452ae3bd837..7e7e1d50c2cd 100755 --- a/examples/python/stable_diffusion/main.py +++ b/examples/python/stable_diffusion/main.py @@ -108,7 +108,8 @@ def main() -> None: ) rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "Depth Guided Stable Diffusion") diff --git a/examples/python/text_logging/main.py b/examples/python/text_logging/main.py index c02a7ae3d6df..7e30ea3e5266 100755 --- a/examples/python/text_logging/main.py +++ b/examples/python/text_logging/main.py @@ -74,7 +74,8 @@ def main() -> None: ) parser.add_argument("--repeat", type=int, default=1, help="How many times do we want to run the log function?") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "text_logging") diff --git a/examples/python/tracking_hf_opencv/main.py b/examples/python/tracking_hf_opencv/main.py index 2c783d0ba341..667af4034f67 100755 --- a/examples/python/tracking_hf_opencv/main.py +++ b/examples/python/tracking_hf_opencv/main.py @@ -393,7 +393,8 @@ def main() -> None: parser.add_argument("--dataset_dir", type=Path, default=DATASET_DIR, help="Directory to save example videos to.") parser.add_argument("--video_path", type=str, default="", help="Full path to video to run on. Overrides `--video`.") rr.script_add_args(parser) - args = parser.parse_args() + args, unknown = parser.parse_known_args() + [__import__("logging").warning(f"unknown arg: {arg}") for arg in unknown] rr.script_setup(args, "tracking_hf_opencv") diff --git a/justfile b/justfile index 90a6b0deecff..912ed2e82c1d 100644 --- a/justfile +++ b/justfile @@ -31,11 +31,35 @@ py-dev-env: venv/bin/pip install -r rerun_py/requirements-lint.txt echo "Do 'source venv/bin/activate' to use the virtual environment!" -# Run all examples -py-run-all: py-build +# Run all examples with the specified args +py-run-all *ARGS: py-build #!/usr/bin/env bash set -euo pipefail - fd main.py | xargs -I _ sh -c "echo _ && python3 _" + find examples/python/ -name main.py | xargs -I _ sh -c 'cd $(dirname _) && echo $(pwd) && python3 main.py {{ARGS}} --num-frames=30 --steps=200' + +# Run all examples in the native viewer +py-run-all-native: py-run-all + +# Run all examples in the web viewer +py-run-all-web: + #!/usr/bin/env bash + set -euo pipefail + + function cleanup { + kill $(jobs -p) + } + trap cleanup EXIT + + cargo r -p rerun --all-features -- --web-viewer & + just py-run-all --connect + +# Run all examples, save them to disk as rrd, then view them natively +py-run-all-rrd *ARGS: + #!/usr/bin/env bash + set -euo pipefail + just py-run-all --save out.rrd + cargo r -p rerun --all-features -- + find examples/python/ -name main.py | xargs -I _ sh -c 'cd $(dirname _) && echo $(pwd) && cargo r -p rerun --all-features -- out.rrd' # Build and install the package into the venv py-build *ARGS: