Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 1 | /* |
Jason Rhinelander | b3f3d79 | 2016-07-18 16:43:18 -0400 | [diff] [blame] | 2 | example/example-eval.cpp -- Usage of eval() and eval_file() |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 3 | |
| 4 | Copyright (c) 2016 Klemens D. Morgenstern |
| 5 | |
| 6 | All rights reserved. Use of this source code is governed by a |
| 7 | BSD-style license that can be found in the LICENSE file. |
| 8 | */ |
| 9 | |
| 10 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 11 | #include <pybind11/eval.h> |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 12 | #include "example.h" |
| 13 | |
Jason Rhinelander | b3f3d79 | 2016-07-18 16:43:18 -0400 | [diff] [blame] | 14 | void example_eval() { |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 15 | py::module main_module = py::module::import("__main__"); |
| 16 | py::object main_namespace = main_module.attr("__dict__"); |
| 17 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 18 | bool ok = false; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 19 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 20 | main_module.def("call_test", [&]() -> int { |
| 21 | ok = true; |
| 22 | return 42; |
| 23 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 24 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 25 | cout << "eval_statements test" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 26 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 27 | auto result = py::eval<py::eval_statements>( |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 28 | "print('Hello World!');\n" |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 29 | "x = call_test();", main_namespace); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 30 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 31 | if (ok && result == py::none()) |
| 32 | cout << "eval_statements passed" << endl; |
| 33 | else |
| 34 | cout << "eval_statements failed" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 35 | |
| 36 | cout << "eval test" << endl; |
| 37 | |
| 38 | py::object val = py::eval("x", main_namespace); |
| 39 | |
| 40 | if (val.cast<int>() == 42) |
| 41 | cout << "eval passed" << endl; |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 42 | else |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 43 | cout << "eval failed" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 44 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 45 | ok = false; |
| 46 | cout << "eval_single_statement test" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 47 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 48 | py::eval<py::eval_single_statement>( |
| 49 | "y = call_test();", main_namespace); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 50 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 51 | if (ok) |
| 52 | cout << "eval_single_statement passed" << endl; |
| 53 | else |
| 54 | cout << "eval_single_statement failed" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 55 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 56 | cout << "eval_file test" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 57 | |
| 58 | int val_out; |
| 59 | main_module.def("call_test2", [&](int value) {val_out = value;}); |
| 60 | |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 61 | try { |
Jason Rhinelander | b3f3d79 | 2016-07-18 16:43:18 -0400 | [diff] [blame] | 62 | result = py::eval_file("example-eval_call.py", main_namespace); |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 63 | } catch (...) { |
Jason Rhinelander | b3f3d79 | 2016-07-18 16:43:18 -0400 | [diff] [blame] | 64 | result = py::eval_file("example/example-eval_call.py", main_namespace); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 65 | } |
| 66 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 67 | if (val_out == 42 && result == py::none()) |
| 68 | cout << "eval_file passed" << endl; |
| 69 | else |
| 70 | cout << "eval_file failed" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 71 | |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 72 | ok = false; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 73 | cout << "eval failure test" << endl; |
| 74 | try { |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 75 | py::eval("nonsense code ..."); |
| 76 | } catch (py::error_already_set &) { |
| 77 | PyErr_Clear(); |
| 78 | ok = true; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 79 | } |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 80 | |
| 81 | if (ok) |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 82 | cout << "eval failure test passed" << endl; |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 83 | else |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 84 | cout << "eval failure test failed" << endl; |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 85 | |
| 86 | ok = false; |
| 87 | cout << "eval_file failure test" << endl; |
| 88 | try { |
| 89 | py::eval_file("nonexisting file"); |
| 90 | } catch (std::exception &) { |
| 91 | ok = true; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 92 | } |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 93 | |
| 94 | if (ok) |
| 95 | cout << "eval_file failure test passed" << endl; |
| 96 | else |
| 97 | cout << "eval_file failure test failed" << endl; |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 98 | } |
| 99 | |
Jason Rhinelander | b3f3d79 | 2016-07-18 16:43:18 -0400 | [diff] [blame] | 100 | void init_ex_eval(py::module & m) { |
| 101 | m.def("example_eval", &example_eval); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 102 | } |