# console_print_node.py
# -*- coding: utf-8 -*-
import json
import logging
from pathlib import Path
import typing as T
import nndeploy.dag
from nndeploy.base import Status
[文档]class ConsolePrintNode(nndeploy.dag.Node):
"""
console node
"""
[文档] def __init__(
self,
name: str,
inputs: list[nndeploy.dag.Edge] = None,
outputs: list[nndeploy.dag.Edge] = None
):
super().__init__(name, inputs, outputs)
self.set_key("nndeploy.basic.ConsolePrintNode")
self.set_desc("将输入内容打印到屏幕,可选日志/落盘")
self.set_input_type(str)
self.set_node_type(nndeploy.dag.NodeType.Output)
self.set_io_type(nndeploy.dag.IOType.String)
self.prefix: str = "" # print prefix
self.echo_to_stdout: bool = True # stdout
self.print_to_logger: bool = False # logging
self.logger_level: str = "INFO" # DEBUG/INFO/WARNING/ERROR/CRITICAL
self.save_to_file: bool = False # save to disk
self.file_path: str = "" # path
self.append_newline: bool = True # newline
self.frontend_params: dict = {
"prefix": self.prefix,
"echo_to_stdout": self.echo_to_stdout,
"print_to_logger": self.print_to_logger,
"logger_level": self.logger_level,
"save_to_file": self.save_to_file,
"file_path": self.file_path,
"append_newline": self.append_newline,
}
def _sync_params_from_frontend(self):
fp = self.frontend_params or {}
self.prefix = str(fp.get("prefix", self.prefix))
self.echo_to_stdout = bool(fp.get("echo_to_stdout", self.echo_to_stdout))
self.print_to_logger = bool(fp.get("print_to_logger", self.print_to_logger))
self.logger_level = str(fp.get("logger_level", self.logger_level)).upper()
self.save_to_file = bool(fp.get("save_to_file", self.save_to_file))
self.file_path = str(fp.get("file_path", self.file_path))
self.append_newline = bool(fp.get("append_newline", self.append_newline))
[文档] def run(self):
in_edge = self.get_input(0)
value = in_edge.get(self)
self._sync_params_from_frontend()
if isinstance(value, (dict, list)):
text = json.dumps(value, ensure_ascii=False)
else:
text = str(value)
message = f"{self.prefix}{text}"
if self.echo_to_stdout:
print(message, flush=True)
if self.print_to_logger:
level = {
"DEBUG": logging.DEBUG,
"INFO": logging.INFO,
"WARNING": logging.WARNING,
"ERROR": logging.ERROR,
"CRITICAL": logging.CRITICAL,
}.get(self.logger_level, logging.INFO)
logging.log(level, message)
if self.save_to_file and self.file_path:
try:
path = Path(self.file_path)
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("a", encoding="utf-8") as f:
if self.append_newline:
f.write(message + "\n")
else:
f.write(message)
except Exception:
logging.exception("[ConsolePrintNode] 写文件失败")
return Status.ok()
[文档] def serialize(self):
base = json.loads(super().serialize())
base["frontend_params"] = self.frontend_params
return json.dumps(base, ensure_ascii=False)
[文档] def deserialize(self, target: str):
obj = json.loads(target)
if "frontend_params" in obj:
self.frontend_params = obj["frontend_params"] or self.frontend_params
self._sync_params_from_frontend()
return super().deserialize(target)
[文档]class ConsolePrintNodeCreator(nndeploy.dag.NodeCreator):
[文档] def __init__(self):
super().__init__()
self.node: T.Optional[ConsolePrintNode] = None
[文档] def create_node(
self,
name: str,
inputs: list[nndeploy.dag.Edge],
outputs: list[nndeploy.dag.Edge]
):
self.node = ConsolePrintNode(name, inputs, outputs)
return self.node
console_print_node_creator = ConsolePrintNodeCreator()
nndeploy.dag.register_node("nndeploy.basic.ConsolePrintNode", console_print_node_creator)