I couldn't find a way to embed a python code which sets flags in C++ code at https://docs.python.org/3.5/extending/embedding.html.
I have this python code test.py:
import tensorflow as tf
# Settings
flags = tf.app.flags
FLAGS = flags.FLAGS
#core params..
flags.DEFINE_string('model', 'gcn', 'model name')
flags.DEFINE_float('learning_rate', 0.01, 'initial learning rate')
flags.DEFINE_string("model_size", "small", "define model size")
def main(argv=None):
print("Flags Set")
print(FLAGS.learning_rate)
if __name__ == '__main__':
tf.app.run()
when I execute the command:
python -m test --learning_rate 0.0002
The output is:
Flags Set
0.0002
How can I embed the above python code in C++ and invoke it?
You have two options,
1. Simply execute the python script with system(),
system("python -m /path/to/test.py --learning_rate 0.0002");
2. Use Python/C Api as follows,
#include <python3.6/Python.h>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
FILE* file;
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
wchar_t** _argv;
for(int i=0; i<argc; i++){
wchar_t *arg = Py_DecodeLocale(argv[i], NULL);
_argv[i] = arg;
}
Py_SetProgramName(program);
Py_Initialize();
PySys_SetArgv(argc, _argv);
file = fopen("/path/to/test.py","r");
PyRun_SimpleFile(file, "/path/to/test.py");
Py_Finalize();
return 0;
}
If you get an executable in a.out, you can run it like below,
./a.out --learning_rate 0.0002
Note:- I have Python.h in python3.6m folder and I used a flag -lpython3.6m for compilation.