You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							2.5 KiB
						
					
					
				| 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 | |
| :func:`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: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     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 <- | |
|  | |
| .. _eval: | |
|  | |
| Evaluating Python expressions from strings and files | |
| ==================================================== | |
|  | |
| pybind11 provides the `eval`, `exec` and `eval_file` functions to evaluate | |
| Python expressions and statements. The following example illustrates how they | |
| can be used. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     // 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::exec( | |
|         "print('Hello')\n" | |
|         "print('world!');", | |
|         scope); | |
| 
 | |
|     // Evaluate the statements in an separate Python file on disk | |
|     py::eval_file("script.py", scope); | |
| 
 | |
| C++11 raw string literals are also supported and quite handy for this purpose. | |
| The only requirement is that the first statement must be on a new line following | |
| the raw string delimiter ``R"(``, ensuring all lines have common leading indent: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::exec(R"( | |
|         x = get_answer() | |
|         if x == 42: | |
|             print('Hello World!') | |
|         else: | |
|             print('Bye!') | |
|         )", scope | |
|     ); | |
| 
 | |
| .. note:: | |
|  | |
|     `eval` and `eval_file` accept a template parameter that describes how the | |
|     string/file 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``). `eval` defaults to  ``eval_expr``, | |
|     `eval_file` defaults to ``eval_statements`` and `exec` is just a shortcut | |
|     for ``eval<eval_statements>``.
 |