How to convert a returned Python dictionary to a C++ std::map
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
|
show 4 more comments
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
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 supportsstd::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
|
show 4 more comments
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
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
python c++ c++builder
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 supportsstd::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
|
show 4 more comments
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 supportsstd::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
|
show 4 more comments
1 Answer
1
active
oldest
votes
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) ) );
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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) ) );
add a comment |
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) ) );
add a comment |
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) ) );
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) ) );
edited Nov 14 '18 at 17:00
answered Nov 13 '18 at 22:14
MajorMajor
371312
371312
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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