Search code examples
pythonc++flagsembedding

How to embed a python code which sets flags in C++


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?


Solution

  • 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.