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