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