Come faccio a importare i moduli in boost :: codice python python incorporato?

StackOverflow https://stackoverflow.com/questions/937884

  •  06-09-2019
  •  | 
  •  

Domanda

sto usando boost :: python per incorporare codice Python in un app. Sono stato in grado di ottenere la stampa dichiarazioni o altre espressioni da valutare correttamente, ma quando si tenta di importare i moduli, non importa e l'applicazione termina. Inoltre il globals () chiamata di funzione nel codice incorporato dà un errore di runtime troppo.

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

Ecco, ho cercato di importare urllib2 utilizzando la funzione di importazione spinta, questo viene compilato ed eseguito correttamente, ma con la seguente dichiarazione exec, dà un errore.

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

O quando rimuovo la funzione boost importazione e faccio l'importazione all'interno del codice incorporato anche, dà un errore. Ho provato ad utilizzare una prova: ad eccezione di: blocco, ma che non funziona neanche. È questo perché il C ++ app non è in grado di trovare la posizione del modulo py urllib2 o qualcosa del genere? C'è un modo per impostare il percorso del modulo prima di provare a importare?

Questo è stato costruito per uso interno, così alcuni codifica dura dei percorsi è accettabile.

Modifica: Più informazioni:
Questo è ciò che succede. Ho fatto un tentativo di cattura .. e chiamato il PyErr_Print (), quando mai v'è un'eccezione, e ottenuto questo come errore di tutto il tempo in cui ci sono le importazioni di moduli o anche chiamate di funzione. Messaggio di errore:

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

Qualcuno può pensare a qualsiasi motivo?

È stato utile?

Soluzione 2

questo non ha aiutato, ma ho trovato una soluzione diversa al mio problema. Il mio codice attuale è simile al seguente:

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

In ogni modo, grazie per la risposta Jonas

Altri suggerimenti

Se non l'hai già, è necessario

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

che ha preso cura dei miei problemi di un paio di anni fa, quando l'incorporamento boost :: python (v2.5 Python).

Modifica:

curiosato nel vecchio codice. Forse questo fa il trucco:

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

Suoni sicuri che in realtà dovrebbe essere necessario il Py_SetProgramName(), ma mi ricordo vagamente un certo commercio di pesce lì.

Ho incontrato lo stesso problema come voi, IEA esempio molto semplice con conseguente TypeError, e trovato la risposta in questa domanda , che era quello di fornire lo spazio dei nomi per due volte, sia come globale e locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top