Вопрос по c++, python – Встраивание и запуск Python несколько раз

3

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

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

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

LookupError: unknown encoding: utf8

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

Просто дополнительный комментарий по этому поводу:boost documentationВы никогда не должны звонитьPy_Finalize(), Они не поддерживают это. Bill Lynch
@sharth Вы правы, и я звоню без использования Py_Finalize, но это нежелательное решение PLuS

Ваш Ответ

1   ответ
3

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

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

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.

Другой проблемой является то, что многие модули не поддерживают это должным образом, как видно, например,в этой теме. I think this is the problem you're facing.

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

by having the engine run in a dedicated process ; by using subinterpreters which represent distinct execution states (of a common interpreter)

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

Похожие вопросы