跳过主要内容

Python 交互

  1. 安装 Dora CLI 及其依赖之前,请先确认您的 Python 3.11 已安装。

    创建并激活虚拟环境,使用 uv 创建一个干净的虚拟环境:

    uv venv --seed -p 3.11
    source .venv/bin/activate # Linux/macOS
    .venv\Scripts\activate # Windows

    安装 Dora CLI

    pip install dora-rs-cli
  2. 建立一个新的数据流(dataflow)

    # 建立一个新的基于 Python 的数据流并导行至项目目录
    dora new conversation_py --lang python
    cd conversation_py

    这将创建以下 conversation_py 目录

    ├── dataflow.yml
    ├── listener-1
    │ ├── README.md
    │ ├── listener_1
    │ │ ├── __init__.py
    │ │ ├── __main__.py
    │ │ └── main.py
    │ ├── pyproject.toml
    │ └── tests
    │ └── test_listener_1.py
    ├── talker-1
    │ ├── README.md
    │ ├── pyproject.toml
    │ ├── talker_1
    │ │ ├── __init__.py
    │ │ ├── __main__.py
    │ │ └── main.py
    │ └── tests
    │ └── test_talker_1.py
    └── talker-2
    ├── README.md
    ├── pyproject.toml
    ├── talker_2
    │ ├── __init__.py
    │ ├── __main__.py
    │ └── main.py
    └── tests
    └── test_talker_2.py
  3. 继续将另一个节点添加到工作区

     dora new --kind node talker --lang python

    现在请在您的文本编辑器中打开文件 talker/talker/main.py

  4. 默认节点如何工作

    您的节点现在非常简陋,但这里是默认情况下其中发生的事情的解释。

    • 本节导入并初始化节点。
    from dora import Node
    import pyarrow as pa

    def main():
    node = Node()
    • 这部分代码检查节点是否收到了任何输入,如果有,它将打印出一些与输入相关的数据。
    for event in node:
    if event["type"] == "INPUT":
    print(
    f"""Node received:
    id: {event["id"]},
    value: {event["value"]},
    metadata: {event["metadata"]}"""
    )
    • 此行代码发送一个输出至另一个节点。
          node.send_output("speech", pa.array(["Hello World"])) # 添加本行代码
    • 我们使用 send_output 方法将字符串作为箭头数组发送到侦听器节点。
    • 第一个参数是我们想要在数据流中稍后引用的输出ID。
    • 第二个参数,pa.array(["Hello World"]),使用 Apache Arrow 处理数据。 在这里,pa.array 从列表["Hello World"]中创建一个箭头数组。
    • 此处省略了元数据的第三个参数,这表明本教程不需要有关传输的其他数据。
  5. 让我们分割监听器节点

      from dora import Node


    def main():
    node = Node()
    for event in node:
    if event["type"] == "INPUT":
    message = event["value"][0].as_py()
    print(f"""I heard {message} from {event["id"]}""")


    if __name__ == "__main__":
    main()

    让我们分割这个脚本中的关键行。

    • event["value"] 包含一个 Apache Arrow 数组,这是一个高效处理复杂数据的结构性方法。 通过访问 [0],我们检索了这个数组的第一个元素。
    • .as_py()方法将箭头元素直接转换为原生的 Python 数据类型。
  6. 运行 数据流(dataflow)

    在运行数据流之前我们必须先修改它:

    nodes:
    - id: talker
    path: talker-1/talker_1/main.py
    inputs:
    tick: dora/timer/secs/1
    outputs:
    - speech

    - id: listener
    path: listener-1/listener_1/main.py
    inputs:
    speech: talker/speech

    在我们运行数据流之前,让我们快速回顾一下。

    • talker 节点将每秒发送一次输入,然后使其发送输出。
    • listener 节点将收到来自 talker 节点的输入,然后打印出它监听到的内容。
    • talker 输出的名称对应于talker 节点中设置的id。

    现在运行数据流。


    # 构建数据流(安装相关依赖):
    dora build dataflow.yml --uv

    # 运行数据流
    dora run dataflow.yml --uv
    • 您应该会看到 listener 节点打印出消息 “I heard Hello World”
  7. 结论

    本教程将完美结束! 您已经学会了创建和运行自定义 Dora 数据流,并集成了 talker 和 listener 节点。 此设置为更复杂的数据流奠定了基础。 如需进一步探索,请考虑尝试不同的数据类型或探索 Dora 的高级功能。 更多教程即将到来!