Come faccio a importare i moduli in boost :: codice python python incorporato?
-
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?
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.