Como faço para importar módulos em boost :: python código python incorporado?

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

  •  06-09-2019
  •  | 
  •  

Pergunta

Eu estou usando boost :: python para incorporar algum código python em um aplicativo. Eu era capaz de obter instruções de impressão ou outras expressões sejam avaliadas corretamente, mas quando eu tento módulos de importação, não é a importação e aplicação está saindo. Além disso, o globals () função chamada no código incorporado dá um erro de execução também.

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

Aqui, eu tentei urllib2 importação usando a função de aumento de importação, Isso compila e é executado corretamente, mas com a seguinte declaração exec, ele dá um erro.

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

Ou quando eu remover a função de aumento de importação e fazer a importação de dentro do código embutido também, ele dá um erro. Eu tentei usar um try: except: bloco, mas isso não quer trabalhar. É isto porque aplicativo do C ++ não é capaz de encontrar a localização do módulo py urllib2 ou algo assim? Existe uma maneira para definir o caminho do módulo antes de tentar importação?

Isto está a ser construído apenas para uso interno, de modo algum disco de codificação dos caminhos é aceitável.

Edit: Mais informações:
Isto é o que acontece. Eu fiz uma tentativa .. captura e chamou o PyErr_Print () quando sempre há uma exceção, e tem isso como erro o tempo todo quando existem importações de módulos ou chamadas de função mesmo. mensagem de erro:

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

Alguém pode pensar em qualquer razão?

Foi útil?

Solução 2

Isso não ajudou, mas eu achei uma solução diferente para o meu problema. Meus olhares de código atual como este:

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

De qualquer forma, obrigado pela resposta Jonas

Outras dicas

Se você não tiver, você precisa

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

Isso cuidou dos meus problemas de um par de anos atrás, quando a incorporação de boost :: python (Python v2.5).

Editar:

remexia no código antigo. Talvez isso faz o truque:

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

Sounds seguro se você realmente precisar o Py_SetProgramName(), mas eu vagamente lembro de alguns negócios de peixe lá.

Corri para o mesmo problema que você, iea exemplo muito simples resultando na TypeError, e encontrou a resposta em este questão, que era para abastecer o namespace duas vezes, tanto como global e local.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top