in service/pybind_sample/client.cpp [27:85]
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");
}