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);