J'ai un problème pour envelopper un Enum pour Python en utilisant Boost-Python.Envelopper les Enums avec Boost-Python
Dans un premier temps que je voulais faire quelque chose comme ce qui suit dans le try-catch (je l'ai inséré mon code ci-dessous l'ensemble) déclaration:
main_namespace["Motion"] = enum_<TestClass::Motion>("Motion")
.value("walk", TestClass::walk)
.value("bike", TestClass::bike)
;
Tout allait bien et la compilation a été fait. Au moment de l'exécution, je suis arrivé cette erreur (ce qui n'a pas de sens pour moi):
AttributeError: 'NoneType' object has no attribute 'Motion'
Ensuite j'ai décidé d'écrire un module Python en utilisant BOOST_PYTHON_MODULE dans mon code. Après avoir initialisé l'interpréteur Python, je voulais utiliser ce module tout de suite, mais je ne savais pas comment (?). Ce qui suit est mon code tout:
#include <boost/python.hpp>
#include <iostream>
using namespace std;
using namespace boost::python;
BOOST_PYTHON_MODULE(test)
{
enum_<TestClass::Motion>("Motion")
.value("walk", TestClass::walk)
.value("bike", TestClass::bike)
;
}
int main()
{
Py_Initialize();
try
{
object pyMainModule = import("__main__");
object main_namespace = pyMainModule.attr("__dict__");
//What previously I intended to do
//main_namespace["Motion"] = enum_<TestClass::Motion>("Motion")
// .value("walk", TestClass::walk)
// .value("bike", TestClass::bike)
//;
//I want to use my enum here
//I need something like line below which makes me able to use the enum!
exec("print 'hello world'", main_namespace, main_namespace);
}
catch(error_already_set const&)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
quelque chose d'utile à savoir sur l'emballage et l'utilisation énumérations en Python sera apprécié! Merci d'avance
Votre démonstration adapter la réponse parfaite. Merci pour ça. Dans la ligne que vous avez forcée, la portée était une sorte d'astuce pour moi. Cela a résolu mon problème en réalité. Je voulais demander une brève explication sur les portées en python. En fait, je ne peux pas comprendre la différence entre une portée et un espace de noms. –
@NOVIN: ['scope'] (http://www.boost.org/doc/libs/1_54_0/libs/python/doc/v2/scope.html#introduction) est une construction Boost.Python utilisée pour représenter le namespace qui contiendra des classes et des fonctions récemment enveloppées. Aussi, si vous avez trouvé la réponse bénéfique, vous pouvez considérer [upvoting ou accepting] (http://meta.stackoverflow.com/help/someone-answers). –