2016-12-20 2 views
5

Обратите внимание, что мне запрещено использовать Python 2.6. У меня есть приложение Python 2.6, которое использует многопоточную библиотеку API C++, созданную с помощью boost-python. Моим вариантом было просто выполнить обратный вызов функции Python из потока повышения C++, но, несмотря на множество разных попыток и исследование всех доступных онлайн-ресурсов, я не нашел никакого способа работы. Все предлагаемые решения вращаются вокруг различного сочетания функций: Py_Initialize*, PyEval_InitThreads, PyGILState_Ensure, PyGILState_Release, но после попытки всех возможных комбинаций ничего не действует на практике, например.Как я могу запустить поток Python FROM C++?

Поэтому этот вопрос: как я могу начать и запустить Python нить от C++? Я в основном хочу: создать его, запустить его с помощью объекта целевой функции Python и забыть об этом.

Возможно ли это?

+0

Может ли это создать новую работу? – otorrillas

+0

Нет, мне нужно создать поток в процессе приложения интерпретатора, к которому я привязан. –

ответ

0

Ответ на OP How to call Python from a boost thread? также отвечает на этот OP или DP (производный :)). Он наглядно демонстрирует, как запустить поток из C++, который обращается к Python. Я протестировал его и отлично работает, хотя нуждается в адаптации для pre-C++ 11. Он использует Boost Python, на самом деле все включено 5 * ответ и example source code is here.

1

Основываясь на тексте ниже из вашего вопроса:

запустить Python нить из C++? Я в основном хочу: создать его, запустить его с помощью объекта целевой функции Python и забыть об этом.

Вы можете найти полезным, чтобы просто порождать процесс, используя sytem:

system("python myscript.py") 

И если вам нужно включить аргументы:

string args = "arg1 arg2 arg3 ... argn" 
system("python myscript.py " + args) 
0

Вы должны позвонить PyEval_InitThreads из вашей обычной инициализации (и оставить GIL сохраненным). Затем вы можете создать pthread (с помощью boost) и в этом потоке вызвать PyGILState_Ensure, затем вызвать свой обратный вызов python (PyObject_CallFunction?), Отпустить любое возвращаемое значение или решить любую ошибку (PyErr_Print?), Отпустить GIL с PyGILState_Release, и пусть нить умирает.

void *my_thread(void *arg) 
{ 
    PyGILState_STATE gstate; 
    PyObject *result; 

    gstate = PyGILState_Ensure(); 

    if ((result = PyObject_CallFunction(func, NULL))) { 
     Py_DECREF(result); 
    } 
    else { 
     PyErr_Print(); 
    } 

    PyGILState_Release(gstate); 

    return NULL; 
} 
+0

Спасибо, но это не отвечает на этот OP, это еще одна возможная комбинация того, что я сделал уже много раз и разными способами, но ОК. Я отправлю вопрос с помощью того, что получаю. У вашего ответа есть несколько новых специй для Python-C++ - concurrent-sup –

+1

. Итак, вы не пробовали * все * возможные решения? – pat

+0

А я знаю, какова различная специя .. вы в основном просите меня отказаться от питона python и напрямую использовать интерфейс Python C. Вы добавляете больше сложности к моей уже сложной проблеме: D. У меня есть функция boost: python :: function func, которую я могу просто называть как «func (params)» –

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