10#if defined(_MSC_VER) && _MSC_VER < 1910
11# pragma warning(disable : 4702)
14#include <pybind11/iostream.h>
28 std::cout << std::flush;
42 auto thread_f = [
this] {
43 static std::mutex cout_mutex;
52 const std::lock_guard<std::mutex> lock(cout_mutex);
53 std::cout <<
"x" << std::flush;
55 std::this_thread::sleep_for(std::chrono::microseconds(50));
58 t_ =
new std::thread(std::move(thread_f));
66 py::gil_scoped_release gil_lock;
71 py::gil_scoped_release gil_lock;
72 std::this_thread::sleep_for(std::chrono::milliseconds(50));
75 std::thread *
t_{
nullptr};
85 m.def(
"captured_output_default", [](
const std::string &msg) {
86 py::scoped_ostream_redirect redir;
87 std::cout << msg << std::flush;
90 m.def(
"captured_output", [](
const std::string &msg) {
91 py::scoped_ostream_redirect redir(std::cout, py::module_::import(
"sys").attr(
"stdout"));
92 std::cout << msg << std::flush;
97 py::call_guard<py::scoped_ostream_redirect>(),
99 py::arg(
"flush") =
true);
101 m.def(
"captured_err", [](
const std::string &msg) {
102 py::scoped_ostream_redirect redir(std::cerr, py::module_::import(
"sys").attr(
"stderr"));
103 std::cerr << msg << std::flush;
106 m.def(
"noisy_function", &
noisy_function, py::arg(
"msg"), py::arg(
"flush") =
true);
110 py::call_guard<py::scoped_ostream_redirect, py::scoped_estream_redirect>(),
114 m.def(
"raw_output", [](
const std::string &msg) { std::cout << msg << std::flush; });
116 m.def(
"raw_err", [](
const std::string &msg) { std::cerr << msg << std::flush; });
118 m.def(
"captured_dual", [](
const std::string &msg,
const std::string &emsg) {
119 py::scoped_ostream_redirect redirout(std::cout, py::module_::import(
"sys").attr(
"stdout"));
120 py::scoped_ostream_redirect redirerr(std::cerr, py::module_::import(
"sys").attr(
"stderr"));
121 std::cout << msg << std::flush;
122 std::cerr << emsg << std::flush;
125 py::class_<TestThread>(m,
"TestThread")
class_< detail::OstreamRedirect > add_ostream_redirect(module_ m, const std::string &name="ostream_redirect")
\rst This is a helper function to add a C++ redirect context manager to Python instead of using a C++...
#define TEST_SUBMODULE(name, variable)
void noisy_funct_dual(const std::string &msg, const std::string &emsg)
void noisy_function(const std::string &msg, bool flush)
std::atomic< bool > stop_