2012-04-18 2 views
2

я использую подталкивание :: питон встраивать питон, это то, как я это делаю:Встраивания питона и работают в несколько раз

void runCode(){ 
    Py_Initialize(); 
    //boost::python code goes here and embedded python code runs 
    Py_Finalize(); 
} 

он работает хорошо в первый раз, но когда он запускается снова , Я получаю эту ошибку:

LookupError: unknown encoding: utf8

и код не работает должным образом, любая помощь приветствуется.

+0

Просто дополнительный комментарий к этому: из [дополнительной документации] (http://www.boost.org/doc/libs/1_52_0/libs/python/doc/tutorial/doc/html/python/embedding.html), вы никогда не должны называть 'Py_Finalize()'. Они не поддерживают его. –

+0

@sharth Вы правы, и я вызываю его без использования Py_Finalize, но это не желаемое решение – PLuS

ответ

2

Поскольку вы не получили экспертного ответа, я предлагаю учиться на аналогичной проблеме. У Python есть проблемы с reinitialization support. Это неудачно, если вам нужно перезапустить интерпретатор из-за некоторой ошибки или вы хотите запустить много независимых интерпретаторов.

Один вопрос есть утечка ресурсов и памяти (цитирую из приведенной выше ссылке):

Bugs and caveats: Dynamically loaded extension modules loaded by Python are not unloaded. Small amounts of memory allocated by the Python interpreter may not be freed (if you find a leak, please report it). Memory tied up in circular references between objects is not freed. Some memory allocated by extension modules may not be freed. Some extensions may not work properly if their initialization routine is called more than once; this can happen if an application calls Py_Initialize() and Py_Finalize() more than once.

Другой вопрос многие модули не поддерживают это правильно, как можно видеть, например in this SO thread. Я думаю, что это проблема, с которой вы сталкиваетесь.

кажется, что большинство приложений Python обходным этой проблемы:

  • , имея двигатель работать в выделенном процессе;
  • с помощью subinterpreters которые представляют собой различные состояния выполнения (от общего переводчика)

Если второй один работает для вас, идти вперед вместе с ним.

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