20 PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
21 PYBIND11_NAMESPACE_BEGIN(detail)
26 using traits_type = std::streambuf::traits_type;
28 const size_t buf_size;
29 std::unique_ptr<char[]> d_buffer;
33 int overflow(
int c)
override {
34 if (!traits_type::eq_int_type(c, traits_type::eof())) {
35 *pptr() = traits_type::to_char_type(c);
38 return sync() == 0 ? traits_type::not_eof(c) : traits_type::eof();
45 if (pbase() != pptr()) {
47 str line(pbase(), static_cast<size_t>(pptr() - pbase()));
55 setp(pbase(), epptr());
66 pythonbuf(
object pyostream,
size_t buffer_size = 1024)
67 : buf_size(buffer_size),
68 d_buffer(
new char[buf_size]),
69 pywrite(pyostream.attr(
"write")),
70 pyflush(pyostream.attr(
"flush")) {
71 setp(d_buffer.get(), d_buffer.get() + buf_size - 1);
82 PYBIND11_NAMESPACE_END(detail)
112 std::ostream &costream;
116 scoped_ostream_redirect(
117 std::ostream &costream = std::cout,
119 : costream(costream), buffer(pyostream) {
120 old = costream.rdbuf(&buffer);
123 ~scoped_ostream_redirect() {
127 scoped_ostream_redirect(
const scoped_ostream_redirect &) =
delete;
128 scoped_ostream_redirect(scoped_ostream_redirect &&other) =
default;
129 scoped_ostream_redirect &operator=(
const scoped_ostream_redirect &) =
delete;
130 scoped_ostream_redirect &operator=(scoped_ostream_redirect &&) =
delete;
148 std::ostream &costream = std::cerr,
154 PYBIND11_NAMESPACE_BEGIN(detail)
160 std::unique_ptr<scoped_ostream_redirect> redirect_stdout;
161 std::unique_ptr<scoped_estream_redirect> redirect_stderr;
164 OstreamRedirect(
bool do_stdout =
true,
bool do_stderr =
true)
165 : do_stdout_(do_stdout), do_stderr_(do_stderr) {}
175 redirect_stdout.reset();
176 redirect_stderr.reset();
180 PYBIND11_NAMESPACE_END(detail)
211 .def(init<bool,bool>(), arg(
"stdout")=
true, arg(
"stderr")=
true)
212 .def(
"__enter__", &detail::OstreamRedirect::enter)
213 .def(
"__exit__", [](detail::OstreamRedirect &self_,
args) { self_.exit(); });
216 PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
~pythonbuf() override
Sync before destroy.
Wrapper for Python extension modules.
static module_ import(const char *name)
Import and return a module or throws error_already_set.
Annotation that marks a class as local to the module:
Annotation for function names.