Вызов функций Python из C ++ DLL вызывает блокировку потоков (GIL Python) - PullRequest
0 голосов
/ 08 марта 2019

Я хочу вызвать некоторые функции Python из C ++ DLL, которая должна вызываться из приложения C #.Я могу отправлять двойные массивы, строки (в массивах символов) на разных языках без проблем (отправка массивов через списки в Python).Теперь я хочу использовать некоторый анализ данных в моих скриптах на python, для которых я называю numpy и pandas.

Здесь CPYInstance и CPyObject являются вспомогательными классами, которые в основном вызывают Py_Initialize и Py_Finalize.

Источник для этих оболочек: https://www.codeproject.com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code

double Train()
{
CPyInstance pyInstance; 
CPyObject pModule = PyImport_ImportModule("build");

if (pModule)
{
    CPyObject pFunc = PyObject_GetAttrString(pModule, "train");
    if (pFunc && PyCallable_Check(pFunc))
    {
        CPyObject pTrainingData = PyList_New(0);
        CPyObject pDate = PyList_New(0);
        for (int i = 0; i < trainingDataSize; i++)
        {
            PyList_Append(pTrainingData, PyFloat_FromDouble(trainingData[i]));
            PyList_Append(pDate, PyUnicode_FromStringAndSize(dateArray[i], DATE_SIZE));
        }
        if (pTrainingData && pDate)
        {
            CPyObject pValue = PyObject_CallFunctionObjArgs(pFunc, pTrainingData, pDate, NULL);
            pFunc.Release();
            pDate.Release();
            pTrainingData.Release();
            if (pValue)
            {
                double num = PyFloat_AsDouble(pValue);
                return num;
            }
            else
            {
                return 1.01;
            }
        }
        else
        {
            return 2.01;
        }
    }
    else
    {
        return 3.01;
    }
    else
    {
        return 4.01;
    }
}

Файл python build.py выглядит следующим образом:

import numpy as np
import pandas as pd

def train(X_train, date):
if(type(X_train) == list):
    df = pd.DataFrame(data = X_train, columns = ['Feature'], index = date);
    df.index.names = ['Date'];
    df.to_csv('dataframe');
    return 100
else:
    return 110

Ошибка при вызове этой функции из приложения C #:

Exception ignored in: <module 'threading' from 'C:\\Users\\magic\\Anaconda3\\Lib\\threading.py'>
Traceback (most recent call last):
File "C:\Users\magic\Anaconda3\Lib\threading.py", line 1289, in _shutdown
assert tlock.locked()
SystemError: <built-in method locked of _thread.lock object at 0x00000216CB115238> returned a result with an error set
1.01
...