Как мне получить текущий PyInterpreterState? - PullRequest
2 голосов
/ 14 февраля 2011

Я хотел бы создать PyThreadState, поскольку для текущего потока его не существует.

Как получить текущий PyInterpreterState для передачи на PyThreadState_New(...), или это то, что я должен делать, только если я встраиваю интерпретатор (и, следовательно, создал его), а не вызываю библиотеку из python?

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

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

//in main thread
PyThreadState * mainThreadState = NULL;

Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyThreadState_Get();
PyEval_ReleaseLock();
//in threaded thread
PyEval_AcquireLock();
PyInterpreterState * mainInterpreterState = mainThreadState->interp;
PyThreadState * myThreadState = PyThreadState_New(mainInterpreterState);
PyEval_ReleaseLock();
/*
 * embeded python part 
 * PyEval_CallObject() for example
 */
1 голос
/ 15 февраля 2011

Оказывается, что отсутствие PyThreadState в основном потоке является фатальной ошибкой.Это было вызвано тем, что две разные версии Python были связаны одновременно, поэтому этот вопрос несколько спорный.

1 голос
/ 14 февраля 2011

Если вы пытаетесь перезвонить в Python из потока, не созданного Python, вы можете использовать API PyGILState_Ensure (). Это заботится о создании временного состояния потока, если у текущего потока его еще нет.

Подробнее см. http://docs.python.org/c-api/init.html#non-python-created-threads.

Выпуск GIL в коде, который вызывается из потока Python, еще проще с помощью макросов Py_BEGIN(/END)_ALLOW_THREADS: http://docs.python.org/c-api/init.html#releasing-the-gil-from-extension-code

...