How to convert a returned Python dictionary to a C++ std::map










3















I'm calling Python from C++, and trying to perform some data conversions.



For example, if I call the following Python function



def getAMap():
data =
data["AnItem 1"] = "Item value 1"
data["AnItem 2"] = "Item value 2"
return data


from C++ as:



PyObject *pValue= PyObject_CallObject(pFunc, NULL);


where pFunc is a PyObject* that points to the getAMap python function.
Code for setting up pFunc omitted for clarity.



The returned pointer, pValue is a pointer to a (among other things) Python dictionary.
Question is, how to get thh dictionary into a std::map on the C++ side as smoothly as possible?



I'm using C++ Builder bcc32 compiler that can't handle any fancy template code, like boost python, or C++11 syntax.



(Changed question as the python object is a dictionary, not a tuple)










share|improve this question
























  • Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

    – David Michael Huber
    Apr 23 '18 at 20:09












  • Also, consider swig.

    – Robᵩ
    Apr 23 '18 at 20:09











  • Rob, I'm using swig in fact.

    – Totte Karlsson
    Apr 23 '18 at 20:12











  • David; that library looks great, but I can't use it with this compiler unfortunately.

    – Totte Karlsson
    Apr 23 '18 at 20:44











  • i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

    – Thomas
    Apr 23 '18 at 20:49
















3















I'm calling Python from C++, and trying to perform some data conversions.



For example, if I call the following Python function



def getAMap():
data =
data["AnItem 1"] = "Item value 1"
data["AnItem 2"] = "Item value 2"
return data


from C++ as:



PyObject *pValue= PyObject_CallObject(pFunc, NULL);


where pFunc is a PyObject* that points to the getAMap python function.
Code for setting up pFunc omitted for clarity.



The returned pointer, pValue is a pointer to a (among other things) Python dictionary.
Question is, how to get thh dictionary into a std::map on the C++ side as smoothly as possible?



I'm using C++ Builder bcc32 compiler that can't handle any fancy template code, like boost python, or C++11 syntax.



(Changed question as the python object is a dictionary, not a tuple)










share|improve this question
























  • Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

    – David Michael Huber
    Apr 23 '18 at 20:09












  • Also, consider swig.

    – Robᵩ
    Apr 23 '18 at 20:09











  • Rob, I'm using swig in fact.

    – Totte Karlsson
    Apr 23 '18 at 20:12











  • David; that library looks great, but I can't use it with this compiler unfortunately.

    – Totte Karlsson
    Apr 23 '18 at 20:44











  • i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

    – Thomas
    Apr 23 '18 at 20:49














3












3








3








I'm calling Python from C++, and trying to perform some data conversions.



For example, if I call the following Python function



def getAMap():
data =
data["AnItem 1"] = "Item value 1"
data["AnItem 2"] = "Item value 2"
return data


from C++ as:



PyObject *pValue= PyObject_CallObject(pFunc, NULL);


where pFunc is a PyObject* that points to the getAMap python function.
Code for setting up pFunc omitted for clarity.



The returned pointer, pValue is a pointer to a (among other things) Python dictionary.
Question is, how to get thh dictionary into a std::map on the C++ side as smoothly as possible?



I'm using C++ Builder bcc32 compiler that can't handle any fancy template code, like boost python, or C++11 syntax.



(Changed question as the python object is a dictionary, not a tuple)










share|improve this question
















I'm calling Python from C++, and trying to perform some data conversions.



For example, if I call the following Python function



def getAMap():
data =
data["AnItem 1"] = "Item value 1"
data["AnItem 2"] = "Item value 2"
return data


from C++ as:



PyObject *pValue= PyObject_CallObject(pFunc, NULL);


where pFunc is a PyObject* that points to the getAMap python function.
Code for setting up pFunc omitted for clarity.



The returned pointer, pValue is a pointer to a (among other things) Python dictionary.
Question is, how to get thh dictionary into a std::map on the C++ side as smoothly as possible?



I'm using C++ Builder bcc32 compiler that can't handle any fancy template code, like boost python, or C++11 syntax.



(Changed question as the python object is a dictionary, not a tuple)







python c++ c++builder






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 24 '18 at 14:36







Totte Karlsson

















asked Apr 23 '18 at 19:49









Totte KarlssonTotte Karlsson

461629




461629












  • Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

    – David Michael Huber
    Apr 23 '18 at 20:09












  • Also, consider swig.

    – Robᵩ
    Apr 23 '18 at 20:09











  • Rob, I'm using swig in fact.

    – Totte Karlsson
    Apr 23 '18 at 20:12











  • David; that library looks great, but I can't use it with this compiler unfortunately.

    – Totte Karlsson
    Apr 23 '18 at 20:44











  • i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

    – Thomas
    Apr 23 '18 at 20:49


















  • Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

    – David Michael Huber
    Apr 23 '18 at 20:09












  • Also, consider swig.

    – Robᵩ
    Apr 23 '18 at 20:09











  • Rob, I'm using swig in fact.

    – Totte Karlsson
    Apr 23 '18 at 20:12











  • David; that library looks great, but I can't use it with this compiler unfortunately.

    – Totte Karlsson
    Apr 23 '18 at 20:44











  • i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

    – Thomas
    Apr 23 '18 at 20:49

















Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

– David Michael Huber
Apr 23 '18 at 20:09






Just found a library that makes it easy to convert Python objects (Python C API) to standard C++ datatypes as it says here. Looks like it might help you due to it also supports std::map.

– David Michael Huber
Apr 23 '18 at 20:09














Also, consider swig.

– Robᵩ
Apr 23 '18 at 20:09





Also, consider swig.

– Robᵩ
Apr 23 '18 at 20:09













Rob, I'm using swig in fact.

– Totte Karlsson
Apr 23 '18 at 20:12





Rob, I'm using swig in fact.

– Totte Karlsson
Apr 23 '18 at 20:12













David; that library looks great, but I can't use it with this compiler unfortunately.

– Totte Karlsson
Apr 23 '18 at 20:44





David; that library looks great, but I can't use it with this compiler unfortunately.

– Totte Karlsson
Apr 23 '18 at 20:44













i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

– Thomas
Apr 23 '18 at 20:49






i would use PyTuple_GetItem and copy the values into a map. Or write a swig typemap that does it for you.

– Thomas
Apr 23 '18 at 20:49













1 Answer
1






active

oldest

votes


















0














It's pretty ugly, but I came up with this:



std::map<std::string, std::string> my_map;

// Python Dictionary object
PyObject *pDict = PyObject_CallObject(pFunc, NULL);

// Both are Python List objects
PyObject *pKeys = PyDict_Keys(pDict);
PyObject *pValues = PyDict_Values(pDict);

for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i)
// PyString_AsString returns a char*
my_map.insert( std::pair<std::string, std::string>(
*PyString_AsString( PyList_GetItem(pKeys, i) ),
*PyString_AsString( PyList_GetItem(pValues, i) ) );






share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49988922%2fhow-to-convert-a-returned-python-dictionary-to-a-c-stdmapstring-string%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    It's pretty ugly, but I came up with this:



    std::map<std::string, std::string> my_map;

    // Python Dictionary object
    PyObject *pDict = PyObject_CallObject(pFunc, NULL);

    // Both are Python List objects
    PyObject *pKeys = PyDict_Keys(pDict);
    PyObject *pValues = PyDict_Values(pDict);

    for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i)
    // PyString_AsString returns a char*
    my_map.insert( std::pair<std::string, std::string>(
    *PyString_AsString( PyList_GetItem(pKeys, i) ),
    *PyString_AsString( PyList_GetItem(pValues, i) ) );






    share|improve this answer





























      0














      It's pretty ugly, but I came up with this:



      std::map<std::string, std::string> my_map;

      // Python Dictionary object
      PyObject *pDict = PyObject_CallObject(pFunc, NULL);

      // Both are Python List objects
      PyObject *pKeys = PyDict_Keys(pDict);
      PyObject *pValues = PyDict_Values(pDict);

      for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i)
      // PyString_AsString returns a char*
      my_map.insert( std::pair<std::string, std::string>(
      *PyString_AsString( PyList_GetItem(pKeys, i) ),
      *PyString_AsString( PyList_GetItem(pValues, i) ) );






      share|improve this answer



























        0












        0








        0







        It's pretty ugly, but I came up with this:



        std::map<std::string, std::string> my_map;

        // Python Dictionary object
        PyObject *pDict = PyObject_CallObject(pFunc, NULL);

        // Both are Python List objects
        PyObject *pKeys = PyDict_Keys(pDict);
        PyObject *pValues = PyDict_Values(pDict);

        for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i)
        // PyString_AsString returns a char*
        my_map.insert( std::pair<std::string, std::string>(
        *PyString_AsString( PyList_GetItem(pKeys, i) ),
        *PyString_AsString( PyList_GetItem(pValues, i) ) );






        share|improve this answer















        It's pretty ugly, but I came up with this:



        std::map<std::string, std::string> my_map;

        // Python Dictionary object
        PyObject *pDict = PyObject_CallObject(pFunc, NULL);

        // Both are Python List objects
        PyObject *pKeys = PyDict_Keys(pDict);
        PyObject *pValues = PyDict_Values(pDict);

        for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i)
        // PyString_AsString returns a char*
        my_map.insert( std::pair<std::string, std::string>(
        *PyString_AsString( PyList_GetItem(pKeys, i) ),
        *PyString_AsString( PyList_GetItem(pValues, i) ) );







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 14 '18 at 17:00

























        answered Nov 13 '18 at 22:14









        MajorMajor

        371312




        371312





























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49988922%2fhow-to-convert-a-returned-python-dictionary-to-a-c-stdmapstring-string%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

            Edmonton

            Crossroads (UK TV series)