ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PythonStdErrOutRedirect.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <pybind11/pybind11.h>
11 
12 #include <utility>
13 
14 namespace py = pybind11;
15 
27 // largely taken from https://github.com/pybind/pybind11/issues/1622
29 {
30  py::object m_stdout;
31  py::object m_stderr;
32  py::object m_stdout_buffer;
33  py::object m_stderr_buffer;
34 
35  public:
40  {
41  auto sysm = py::module::import("sys");
42  m_stdout = sysm.attr("stdout");
43  m_stderr = sysm.attr("stderr");
44  auto ccConsoleOutput = py::module::import("ccinternals").attr("ccConsoleOutput");
45  m_stdout_buffer = ccConsoleOutput();
46  m_stderr_buffer = ccConsoleOutput();
47  sysm.attr("stdout") = m_stdout_buffer;
48  sysm.attr("stderr") = m_stderr_buffer;
49  }
50 
59  PyStdErrOutStreamRedirect(py::object stdout_obj, py::object stderr_obj)
60  {
61  auto sysm = py::module::import("sys");
62  m_stdout = sysm.attr("stdout");
63  m_stderr = sysm.attr("stderr");
64  m_stdout_buffer = std::move(stdout_obj);
65  m_stderr_buffer = std::move(stderr_obj);
66  sysm.attr("stdout") = m_stdout_buffer;
67  sysm.attr("stderr") = m_stderr_buffer;
68  }
69 
71  {
72  try
73  {
74  const auto sysm = py::module::import("sys");
75  sysm.attr("stdout") = m_stdout;
76  sysm.attr("stderr") = m_stderr;
77  }
78  catch (const std::exception &)
79  {
80  }
81  }
82 };
PyStdErrOutStreamRedirect(py::object stdout_obj, py::object stderr_obj)
Redirects messages to ACloudViewer's console output.
Definition: Consoles.h:77