2009-06-02 6 views
10

J'utilise boost :: python pour intégrer du code python dans une application. J'ai été en mesure d'obtenir des instructions d'impression ou d'autres expressions à évaluer correctement, mais lorsque j'essaie d'importer des modules, il n'est pas importé et l'application est en cours de fermeture. De plus, l'appel de la fonction globals() dans le code incorporé donne aussi une erreur d'exécution.Comment importer des modules dans le code python embarqué boost :: python?

#include <boost/python.hpp> 

using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
    Py_Initialize(); 
    object main_module = import("__main__"); 
    object main_namespace = main_module.attr("__dict__"); 
    main_namespace["urllib2"] = import("urllib2"); 

    object ignored = exec(
      "print 'time'\n", main_namespace); 
} 

Ici, j'ai essayé d'importer urllib2 en utilisant la fonction d'importation de boost, cette compile et fonctionne correctement, mais avec l'instruction exec suivante, il donne une erreur. Ou lorsque je supprime la fonction d'importation boost et que j'importe également à partir du code embarqué, cela donne une erreur. J'ai essayé d'utiliser un try: except: block mais ça ne marche pas non plus. Est-ce parce que l'application C++ n'est pas capable de trouver l'emplacement du module urllib2 py ou quelque chose? Est-il possible de définir le chemin du module avant d'essayer d'importer?

Ceci est construit uniquement pour un usage interne, donc un codage dur des chemins est acceptable.

Modifier: Plus d'infos:
C'est ce qui se passe. J'ai fait un essai .. attrape et appelle le PyErr_Print() quand il y a une exception, et l'ai eu comme erreur tout le temps quand il y a des modules d'importation ou même des appels de fonction. Message d'erreur:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: 'NoneType' object does not support item assignment 

Quelqu'un peut-il penser à une raison quelconque?

Répondre

3

Cela n'a pas aidé, mais j'ai trouvé une solution différente à mon problème. Mon code actuel ressemble à ceci:

#include <boost/python.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
     Py_Initialize(); 
     boost::python::object http = boost::python::import("urllib2"); 

     try 
     { 
       boost::python::object response = http.attr("urlopen")("http://www.google.com"); 
       boost::python::object read = response.attr("read")(); 
       std::string strResponse = boost::python::extract<string>(read); 
       cout << strResponse << endl; 
     } 
     catch(...) 
     { 
       PyErr_Print(); 
       PyErr_Clear(); 
     } 
} 

Quoi qu'il en soit, merci pour la réponse Jonas

+0

Heureux que vous avez obtenu votre code de travail. Qu'est-ce que tu veux faire avec? –

+0

Oh. J'étais complètement malade des bibliothèques de sockets C++. Ils ont besoin de temps pour comprendre, et comme je ne suis pas un étudiant en informatique, je prends plus de temps à comprendre. Donc, j'ai créé quelque chose qui ressemble à une urllib asynchrone ++ avec le urllib2 python dans le dos. : D Je sais que cela semble fou. Mais j'ai une solution extrêmement pratique maintenant! – Sahas

+0

Hehe, c'est bon pour vous! –

4

Si vous avez pas déjà, vous devez

 
import sys 
sys.path.append("/home/user/whatever") 

qui a pris soin de mes problèmes, il y a quelques années quand boost :: python intégration (Python v2.5).

Edit:

autour dans le code poked ancien. Peut-être fait le tour:

 
Py_SetProgramName(argv[0]); 
Py_InitializeEx(0); 

sons pas certain que vous devriez vraiment besoin Py_SetProgramName(), mais je me souviens vaguement des affaires là-bas fishy.

+0

Merci pour la réponse, et vraiment pour le retard dans l'essayer et vous dire, Jonas. J'ai essayé, mais cela n'a pas aidé. Je ne suis même pas capable d'exécuter le programme s'il a cette seule instruction "print globals() \ n". J'ai essayé le même code sur Windows et Linux, et la même réponse partout. J'utilise Boost 1.39.0 – Sahas

+0

Oops. Je n'avais pas remarqué le montage. Je vais essayer ça aussi. – Sahas

+1

J'avais une erreur de segmentation mystérieuse lors de l'importation de certaines bibliothèques (comme gzip ou numpy). Ensuite, ce hack permet de résoudre le problème comme un charme: 'Py_SetProgramName ("");' ' Py_InitializeEx (0);' Merci @Jonas –

0

Je couru dans le même problème que vous, IEA exemple très simple résultant du TypeError, et a trouvé la réponse à this question, qui devait fournir deux fois l'espace de noms, à la fois global et local.

Questions connexes