utilities.rst revision 11986
111986Sandreas.sandberg@arm.comUtilities
211986Sandreas.sandberg@arm.com#########
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.comUsing Python's print function in C++
511986Sandreas.sandberg@arm.com====================================
611986Sandreas.sandberg@arm.com
711986Sandreas.sandberg@arm.comThe usual way to write output in C++ is using ``std::cout`` while in Python one
811986Sandreas.sandberg@arm.comwould use ``print``. Since these methods use different buffers, mixing them can
911986Sandreas.sandberg@arm.comlead to output order issues. To resolve this, pybind11 modules can use the
1011986Sandreas.sandberg@arm.com:func:`py::print` function which writes to Python's ``sys.stdout`` for consistency.
1111986Sandreas.sandberg@arm.com
1211986Sandreas.sandberg@arm.comPython's ``print`` function is replicated in the C++ API including optional
1311986Sandreas.sandberg@arm.comkeyword arguments ``sep``, ``end``, ``file``, ``flush``. Everything works as
1411986Sandreas.sandberg@arm.comexpected in Python:
1511986Sandreas.sandberg@arm.com
1611986Sandreas.sandberg@arm.com.. code-block:: cpp
1711986Sandreas.sandberg@arm.com
1811986Sandreas.sandberg@arm.com    py::print(1, 2.0, "three"); // 1 2.0 three
1911986Sandreas.sandberg@arm.com    py::print(1, 2.0, "three", "sep"_a="-"); // 1-2.0-three
2011986Sandreas.sandberg@arm.com
2111986Sandreas.sandberg@arm.com    auto args = py::make_tuple("unpacked", true);
2211986Sandreas.sandberg@arm.com    py::print("->", *args, "end"_a="<-"); // -> unpacked True <-
2311986Sandreas.sandberg@arm.com
2411986Sandreas.sandberg@arm.comEvaluating Python expressions from strings and files
2511986Sandreas.sandberg@arm.com====================================================
2611986Sandreas.sandberg@arm.com
2711986Sandreas.sandberg@arm.compybind11 provides the :func:`eval` and :func:`eval_file` functions to evaluate
2811986Sandreas.sandberg@arm.comPython expressions and statements. The following example illustrates how they
2911986Sandreas.sandberg@arm.comcan be used.
3011986Sandreas.sandberg@arm.com
3111986Sandreas.sandberg@arm.comBoth functions accept a template parameter that describes how the argument
3211986Sandreas.sandberg@arm.comshould be interpreted. Possible choices include ``eval_expr`` (isolated
3311986Sandreas.sandberg@arm.comexpression), ``eval_single_statement`` (a single statement, return value is
3411986Sandreas.sandberg@arm.comalways ``none``), and ``eval_statements`` (sequence of statements, return value
3511986Sandreas.sandberg@arm.comis always ``none``).
3611986Sandreas.sandberg@arm.com
3711986Sandreas.sandberg@arm.com.. code-block:: cpp
3811986Sandreas.sandberg@arm.com
3911986Sandreas.sandberg@arm.com    // At beginning of file
4011986Sandreas.sandberg@arm.com    #include <pybind11/eval.h>
4111986Sandreas.sandberg@arm.com
4211986Sandreas.sandberg@arm.com    ...
4311986Sandreas.sandberg@arm.com
4411986Sandreas.sandberg@arm.com    // Evaluate in scope of main module
4511986Sandreas.sandberg@arm.com    py::object scope = py::module::import("__main__").attr("__dict__");
4611986Sandreas.sandberg@arm.com
4711986Sandreas.sandberg@arm.com    // Evaluate an isolated expression
4811986Sandreas.sandberg@arm.com    int result = py::eval("my_variable + 10", scope).cast<int>();
4911986Sandreas.sandberg@arm.com
5011986Sandreas.sandberg@arm.com    // Evaluate a sequence of statements
5111986Sandreas.sandberg@arm.com    py::eval<py::eval_statements>(
5211986Sandreas.sandberg@arm.com        "print('Hello')\n"
5311986Sandreas.sandberg@arm.com        "print('world!');",
5411986Sandreas.sandberg@arm.com        scope);
5511986Sandreas.sandberg@arm.com
5611986Sandreas.sandberg@arm.com    // Evaluate the statements in an separate Python file on disk
5711986Sandreas.sandberg@arm.com    py::eval_file("script.py", scope);
58