From 722b95a0b04066b3b2e6e0f5c6cac419fde501ce Mon Sep 17 00:00:00 2001 From: haixuanTao Date: Wed, 19 Mar 2025 19:06:05 +0100 Subject: [PATCH] Adding multi-env exanple --- examples/python-multi-env/.gitignore | 1 + examples/python-multi-env/README.md | 10 +++++ examples/python-multi-env/dataflow.yml | 32 ++++++++++++++ examples/python-multi-env/run.rs | 60 ++++++++++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 examples/python-multi-env/.gitignore create mode 100644 examples/python-multi-env/README.md create mode 100644 examples/python-multi-env/dataflow.yml create mode 100644 examples/python-multi-env/run.rs diff --git a/examples/python-multi-env/.gitignore b/examples/python-multi-env/.gitignore new file mode 100644 index 00000000..eede66d8 --- /dev/null +++ b/examples/python-multi-env/.gitignore @@ -0,0 +1 @@ +*.pt \ No newline at end of file diff --git a/examples/python-multi-env/README.md b/examples/python-multi-env/README.md new file mode 100644 index 00000000..b2516197 --- /dev/null +++ b/examples/python-multi-env/README.md @@ -0,0 +1,10 @@ +# Python Dataflow Example + +This examples shows how to connect two different python virtual env with python. + +```bash +uv venv --seed -p 3.11 -n env_1 +uv venv --seed -p 3.11 -n env_2 +dora build dataflow.yml --uv +dora run dataflow.yml --uv +``` diff --git a/examples/python-multi-env/dataflow.yml b/examples/python-multi-env/dataflow.yml new file mode 100644 index 00000000..3bea06ab --- /dev/null +++ b/examples/python-multi-env/dataflow.yml @@ -0,0 +1,32 @@ +nodes: + - id: camera + build: pip install -e ../../node-hub/opencv-video-capture + path: opencv-video-capture + inputs: + tick: dora/timer/millis/20 + outputs: + - image + env: + CAPTURE_PATH: 0 + IMAGE_WIDTH: 640 + IMAGE_HEIGHT: 480 + VIRTUAL_ENV: env_1 + + - id: object-detection + build: pip install -e ../../node-hub/dora-yolo + path: dora-yolo + inputs: + image: camera/image + outputs: + - bbox + env: + VIRTUAL_ENV: env_2 + + - id: plot + build: pip install dora-rerun + path: dora-rerun + inputs: + image: camera/image + boxes2d: object-detection/bbox + env: + VIRTUAL_ENV: env_1 diff --git a/examples/python-multi-env/run.rs b/examples/python-multi-env/run.rs new file mode 100644 index 00000000..23b254e2 --- /dev/null +++ b/examples/python-multi-env/run.rs @@ -0,0 +1,60 @@ +use dora_core::{get_uv_path, run}; +use dora_tracing::set_up_tracing; +use eyre::{bail, WrapErr}; +use std::path::Path; + +#[tokio::main] +async fn main() -> eyre::Result<()> { + set_up_tracing("python-dataflow-runner")?; + + let root = Path::new(env!("CARGO_MANIFEST_DIR")); + std::env::set_current_dir(root.join(file!()).parent().unwrap()) + .wrap_err("failed to set working dir")?; + + let uv = get_uv_path().context("Could not get uv binary")?; + + run(&uv, &["venv", "-p", "3.10", "--seed"], None) + .await + .context("failed to create venv")?; + + run( + &uv, + &[ + "pip", + "install", + "-e", + "../../apis/python/node", + "--reinstall", + ], + None, + ) + .await + .context("Unable to install develop dora-rs API")?; + + let dataflow = Path::new("dataflow.yml"); + run_dataflow(dataflow).await?; + + Ok(()) +} + +async fn run_dataflow(dataflow: &Path) -> eyre::Result<()> { + let cargo = std::env::var("CARGO").unwrap(); + + // First build the dataflow (install requirements) + let mut cmd = tokio::process::Command::new(&cargo); + cmd.arg("run"); + cmd.arg("--package").arg("dora-cli"); + cmd.arg("--").arg("build").arg(dataflow).arg("--uv"); + if !cmd.status().await?.success() { + bail!("failed to run dataflow"); + }; + + let mut cmd = tokio::process::Command::new(&cargo); + cmd.arg("run"); + cmd.arg("--package").arg("dora-cli"); + cmd.arg("--").arg("run").arg(dataflow).arg("--uv"); + if !cmd.status().await?.success() { + bail!("failed to run dataflow"); + }; + Ok(()) +}