service/pybind_sample/client.cpp (56 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <pybind11/embed.h> // everything needed for embedding
#include <fstream>
#include <string>
namespace py = pybind11;
using namespace py::literals;
int main() {
py::scoped_interpreter guard{}; // start the interpreter and keep it alive
printf(
"++++++++++PLEASE MAKE SURE YOU ARE IN THE PYBIND_SAMPLE DIRECTORY WHEN "
"RUNNING THE BINARY+++++++++\n");
printf("This is so the program correctly finds the Python files in the "
"pybind_sample directory\n\n");
printf("We can read a Python file into a string and execute its entirety\n");
std::ifstream ifs("print_sample.py", std::ifstream::in);
std::string str = "";
char c = ifs.get();
while (ifs.good()) {
str += c;
c = ifs.get();
}
py::exec(str);
ifs.close();
printf("\nWe can call a Python module from a file\n");
py::object sdk_validator = py::module_::import("validator_example");
py::object validate = sdk_validator.attr("validate");
py::object res = validate("some_string");
if (res == py::bool_(true))
printf("validate returned true\n");
else
printf("validate returned false\n");
printf("\nWe can also mix direct execution and the C++ library\n");
auto txn =
py::dict("id"_a = "918544363", "asset"_a = py::dict("id"_a = "1111"));
auto locals = py::dict("name"_a = "World", "number"_a = 42, "txn"_a = txn);
py::exec(R"(
def validate(transaction):
print(f'Validating {transaction}')
if (not transaction) or type(transaction) is not dict:
return False
if "id" not in transaction:
return False
if "asset" not in transaction:
return False
if "id" not in transaction["asset"]:
return False
if transaction["id"] == None or transaction["asset"] == None:
return False
return True
is_valid = validate(txn)
print(f"validate returned {is_valid}")
)",
py::globals(), locals);
auto is_valid = locals["is_valid"].cast<bool>();
if (is_valid)
printf("Valid\n");
}