IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Plantage avec Boost.Python


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut Plantage avec Boost.Python
    Bonjour à tous.

    En ce moment je m'essaye à Boost.Python, le code ci dessous compile sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <boost/python.hpp>
    #include <iostream>
     
    using namespace boost::python;
     
    void greet()
    { 
        // Retrieve the main module.
        object main = import("__main__");
     
        // Retrieve the main module's namespace
        object global(main.attr("__dict__"));
     
        // Define greet function in Python.
        object result = exec("def greet():\n" "    return 'Hello from Python!' \n", global, global);
     
        // Create a reference to it.
        object greet = global["greet"];
     
        // Call it.
        std::string message = extract<std::string>(greet());
        std::cout << message << std::endl;
    }
     
    void greet_file()
    { 
        // Retrieve the main module.
        object main = import("__main__");
     
        // Retrieve the main module's namespace
        object global(main.attr("__dict__"));
     
        // Define greet function in Python.
        object result = exec_file("hello.py", global, global);
     
        // Create a reference to it.
        object greet = global["greet"];
     
        // Call it.
        std::string message = extract<std::string>(greet());
        std::cout << message << std::endl;
    }
     
    void main(int argc, char** argv)
    {
        Py_Initialize();
     
        greet();
     
        greet_file();
    }
    et il s'execute sans problème lorsque je génère la librairie boost.python avec python 2.7. J'obtiens bien l'output suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Hello from Python!
    Hello from Python!
    En revanche, si je génère la même librairie avec python 3.2.3, la première ligne s'affiche bien (donc "exec" marche) mais ensuite j'ai un message d'erreur de windows
    monprog.exe has stopped working...
    Je suppose donc que c'est "exec_file" qui pose un problème.
    Avez vous une idée ?
    J'ai cherché sur la mailing list de boost, je n'ai rien trouvé de similaire, c'est peut-être ma config...

    Merci pour votre aide.

    ps. : j'ai essayé en "linkant" en static et en dynamic ; même résultat.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je crois que la dernière version de Boost.Python date de 2003, soit bien avant Python 3.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Merci pour ta réponse oodini. J'ai rien contre, à priori, le fait d'utiliser python 2.7. C'est juste que je trouvais dommage de passer à coté de python 3 (question de pérennité). J'ai posté un message sur la mailing list de boost, on verra bien...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Bon après avoir cherché un peu, il semblerait que le problème vienne effectivement du fait que l'API de python aie changée entre 2.x et 3.x

    dans boost.python, on a le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    object BOOST_PYTHON_DECL exec_file(str filename, object global, object local)
    {
      // Set suitable default values for global and local dicts.
      if (global.is_none())
      {
        if (PyObject *g = PyEval_GetGlobals())
          global = object(detail::borrowed_reference(g));
        else
          global = dict();
      }
      if (local.is_none()) local = global;
      // should be 'char const *' but older python versions don't use 'const' yet.
      char *f = python::extract<char *>(filename);
    #if PY_VERSION_HEX >= 0x03000000
      // TODO(bhy) temporary workaround for Python 3.
      // should figure out a way to avoid binary incompatibilities as the Python 2
      // version did.
      FILE *fs = fopen(f, "r");
    #else
      // Let python open the file to avoid potential binary incompatibilities.
      PyObject *pyfile = PyFile_FromString(f, const_cast<char*>("r"));
      if (!pyfile) throw std::invalid_argument(std::string(f) + " : no such file");
      python::handle<> file(pyfile);
      FILE *fs = PyFile_AsFile(file.get());
    #endif
      PyObject* result = PyRun_File(fs,
                    f,
                    Py_file_input,
                    global.ptr(), local.ptr());
      if (!result) throw_error_already_set();
      return object(detail::new_reference(result));
    }
    PyFile_FromString et PyFile_AsFile n'existent pas dans l'API Python 3.x. et, apparemment, l'auteur de la lib en a conscience et a mis "vite fait" (ligne 18) un simple fopen qui semble être la source de mes ennuis...

    Il y a quand même un truc positif, c'est que la lib semble être maintenue un minimum (on peut voir le log en récupérant le trunk SVN de boost).

    En attendant, je me suis inspiré de ça pour contourner, en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object result = exec_file("c:\\hello.py", global, global);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::vector<char> input;
    std::ifstream file("c:\\hello.py", std::ifstream::in);
     
    file >> std::noskipws;
    std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>(), std::back_inserter(input));
    input.push_back('\n');
    input.push_back('\0');
     
    object result = exec(input.data(), global, global);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C++/Python (avec Boost) foireux sous Windows
    Par khazna dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 17/07/2014, 09h54
  2. Assertion failed avec Boost.Python
    Par spartan811 dans le forum Boost
    Réponses: 0
    Dernier message: 15/05/2012, 15h27
  3. Réponses: 1
    Dernier message: 20/12/2010, 16h41
  4. boost python avec codegear
    Par dj.motte dans le forum Boost
    Réponses: 0
    Dernier message: 04/12/2009, 22h30
  5. Pb de configuration postgre -> plantage avec DB error
    Par liv dans le forum Installation
    Réponses: 6
    Dernier message: 05/11/2003, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo