2009-06-02 6 views
10

Ich verwende boost :: python, um Python-Code in eine App einzubetten. Ich konnte Druckanweisungen oder andere Ausdrücke richtig ausgewertet bekommen, aber wenn ich versuche, Module zu importieren, wird nicht importiert und die Anwendung wird beendet. Außerdem gibt der Funktionsaufruf von globals() im eingebetteten Code auch einen Laufzeitfehler.Wie importiere ich Module in boost :: python eingebetteten Python-Code?

#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); 
} 

Hier, ich habe versucht, die Boost-Import-Funktion zu importieren urllib2 verwenden, das kompiliert und läuft einwandfrei, jedoch mit folgenden exec-Anweisung, gibt es einen Fehler.

Oder wenn ich die Boost-Import-Funktion entfernen und den Import aus dem eingebetteten Code auch ausführen, gibt es einen Fehler. Ich versuchte es mit einem Versuch: außer: Block, aber das funktioniert auch nicht. Liegt das daran, dass die C++ App nicht in der Lage ist, den Speicherort des urllib2 Py-Moduls oder so etwas zu finden? Gibt es eine Möglichkeit, den Pfad des Moduls vor dem Import festzulegen?

Dies ist nur für den internen Gebrauch gebaut, so dass einige harte Codierung der Pfade akzeptabel ist.

Bearbeiten: Weitere Informationen:
Dies ist, was passiert. Ich habe es versucht .. Fang und rief die PyErr_Print() wenn es immer eine Ausnahme gibt, und bekam dies als Fehler die ganze Zeit, wenn Modul importiert oder sogar Funktionsaufrufe. Fehlermeldung:

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

Kann jemand aus irgendeinem Grund denken?

Antwort

3

Das hat nicht geholfen, aber ich fand eine andere Lösung für mein Problem. Meine aktuellen Code sieht wie folgt aus:

#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(); 
     } 
} 

Anyways, danke für die Antwort Jonas

+0

Gut, dass Sie Ihren Code arbeiten habe. Was willst du damit machen? –

+0

Oh. Ich war total satt von den C++ - Socket-Bibliotheken. Sie brauchen Zeit, um zu verstehen, und da ich kein Computerstudent bin, brauche ich länger um zu verstehen. Also habe ich etwas erstellt, das sich wie ein asynchrones urllib ++ mit dem Python urllib2 auf der Rückseite anfühlt. : D Ich weiß, es klingt verrückt. Aber ich habe jetzt eine extrem bequeme Lösung! – Sahas

+0

Hehe, gut für dich! –

4

Wenn Sie nicht bereits haben, müssen Sie

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

, die vor ein paar Jahren meiner Probleme kümmerten, wenn Schub Einbettung :: Python (Python v2.5).

Bearbeiten:

In alten Code herumgestochert. Vielleicht tut dies der Trick:

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

unsicher klingt, dass Sie wirklich die Py_SetProgramName() brauchen sollte, aber ich schwach etwas fischig Geschäft dort erinnern.

+0

Danke für die Antwort, und wirklich für die Verzögerung, es zu versuchen und Ihnen zu sagen, Jonas. Ich habe es versucht, aber das hat nicht geholfen. Ich bin nicht einmal in der Lage, das Programm zum Laufen zu bringen, wenn es diese einzelne Aussage "print globals() \ n" hat. Ich habe den gleichen Code auf Windows und Linux und die gleiche Antwort überall versucht. Ich benutze Boost 1.39.0 – Sahas

+0

Ups. Ich hatte den Schnitt nicht bemerkt. Ich werde das auch versuchen. – Sahas

+1

Ich hatte einen mysteriösen Segmentierungsfehler beim Importieren bestimmter Bibliotheken (z. B. gzip oder numpy). Dann löst dieser Hack das Problem wie ein Zauber: 'Py_SetProgramName ("");' ' Py_InitializeEx (0);' Dank @Jonas –

0

ich in das gleiche Problem lief wie Sie, iea sehr einfaches Beispiel in der Typeerror führt, und fand die Antwort in this question, welches den Namespace zweimal sowohl global als auch lokal liefern sollte.