2009-06-02 3 views
10

Я использую boost :: python для встраивания кода python в приложение. Я смог получить правильные вычисления операторов печати или других выражений, но когда я пытаюсь импортировать модули, это не импорт, а приложение выходит. Кроме того, вызов функции globals() во встроенном коде также приводит к ошибке выполнения.Как импортировать модули в boost :: python встроенный код 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); 
} 

Здесь я пытался импортировать urllib2, используя функцию импорта наддува, это компилируется и работает нормально, но со следующим ехес заявление, он дает ошибку.

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

Или когда я удаляю функцию импорта boost и выполняю импорт из встроенного кода, он дает ошибку. Я попытался использовать try: except: block, но это тоже не работает. Это потому, что приложение C++ не может найти расположение модуля urllib2 py или что-то еще? Есть ли способ установить путь к модулю перед попыткой импорта?

Это строится только для внутреннего использования, поэтому допустимо некоторая жесткая кодировка путей.

Редактировать: More info:
Это то, что происходит. Я сделал попытку .. поймал и назвал PyErr_Print(), когда когда-либо было исключение, и получил это как ошибку все время, когда есть импорт модулей или даже вызовы функций. Сообщение об ошибке:

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

Может ли кто-нибудь подумать о какой-либо причине?

ответ

3

Это не помогло, но я нашел другое решение моей проблемы. Мой текущий код выглядит следующим образом:

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

В любом случае, спасибо за ответ Jonas

+0

Рад, что вы получили ваш код работает. Что вы хотите с этим делать? –

+0

Ох. Я был полностью болен библиотеками сокетов C++. Им нужно время, чтобы понять, и, поскольку я не студент компьютеров, я занимаю больше времени, чтобы понять. Поэтому я создал нечто похожее на асинхронный urllib ++ с python urllib2 в спину. : D Я знаю, это звучит безумно. Но у меня сейчас очень удобное решение! – Sahas

+0

Хе-хе, хорошо для вас! –

4

Если вы еще не сделали, вам нужно

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

Это заботилась о моих проблемах пару лет назад, когда вложение подталкивание :: питон (Python v2.5).

Редактировать:

Poked around in old code. Возможно, это делает трюк:

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

Звуки уверены, что вы действительно должны нуждаться в Py_SetProgramName(), но я слабо помню некоторые тусклый там бизнес.

+0

Спасибо за ответ, и действительно за задержку в попытке его и рассказать вам, Йонас. Я пробовал, но это не помогло. Я даже не могу запустить программу, если у нее есть этот единственный оператор «print globals() \ n». Я пробовал один и тот же код на windows и linux, и тот же самый ответ везде. Я использую Boost 1.39.0 – Sahas

+0

Упс. Я не заметил редактирования. Я тоже попробую. – Sahas

+1

У меня возникла таинственная ошибка сегментации при импорте определенных библиотек (например, gzip или numpy). Тогда этот хак решает эту проблему, как шарм: 'Py_SetProgramName ("");' ' Py_InitializeEx (0);' Спасибо @Jonas –

0

Я столкнулся с той же проблемой, как вы, IEA очень простой пример, в результате чего в TypeError, и нашел ответ в this question, который должен был предоставить пространство имен дважды, как глобальное, так и локальное.

Смежные вопросы