Utilities

Using Python’s print function in C++

The usual way to write output in C++ is using std::cout while in Python one would use print. Since these methods use different buffers, mixing them can lead to output order issues. To resolve this, pybind11 modules can use the py::print() function which writes to Python’s sys.stdout for consistency.

Python’s print function is replicated in the C++ API including optional keyword arguments sep, end, file, flush. Everything works as expected in Python:

py::print(1, 2.0, "three"); // 1 2.0 three
py::print(1, 2.0, "three", "sep"_a="-"); // 1-2.0-three

auto args = py::make_tuple("unpacked", true);
py::print("->", *args, "end"_a="<-"); // -> unpacked True <-

Evaluating Python expressions from strings and files

pybind11 provides the eval() and eval_file() functions to evaluate Python expressions and statements. The following example illustrates how they can be used.

Both functions accept a template parameter that describes how the argument should be interpreted. Possible choices include eval_expr (isolated expression), eval_single_statement (a single statement, return value is always none), and eval_statements (sequence of statements, return value is always none).

// At beginning of file
#include <pybind11/eval.h>

...

// Evaluate in scope of main module
py::object scope = py::module::import("__main__").attr("__dict__");

// Evaluate an isolated expression
int result = py::eval("my_variable + 10", scope).cast<int>();

// Evaluate a sequence of statements
py::eval<py::eval_statements>(
    "print('Hello')\n"
    "print('world!');",
    scope);

// Evaluate the statements in an separate Python file on disk
py::eval_file("script.py", scope);