Ошибка GIL() должна быть выпущена при использовании PythonNet для вызова скриптов Python из файла C#.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка GIL() должна быть выпущена при использовании PythonNet для вызова скриптов Python из файла C#.

Сообщение Anonymous »

Я запускаю класс в более крупном приложении, которое использует PythonNet для вызова функций из скрипта Python. Я сначала запускаю эти строки, если Python Engine еще не инициализирован -

Код: Выделить всё

Runtime.PythonDLL = @"C:\Users\micro\AppData\Local\Programs\Python\Python39\python39.dll";
PythonEngine.Initialize();
Py.GIL();
остальная функциональность находится в этом разделе -

Код: Выделить всё

using (var scope = Py.CreateScope())
{
dynamic sys = Py.Import("sys");
sys.path.append(@"C:\Users\micro\source\repos\REFWebApp\REFWebApp.Server\Evaluation\STTs\");
var scriptCompiled = Py.Import(scriptname);
string[] message = filenames;
var result = scriptCompiled.InvokeMethod("transcribe_all", message.ToPython());
PyObject[] pylist = result.AsManagedObject(typeof(PyObject[])) as PyObject[];

List transcriptions = new List();

foreach (PyObject pyobject in pylist)
{
string transcript = (string)pyobject.AsManagedObject(typeof(string));
Console.WriteLine(transcript);
transcriptions.Add(transcript);

}
Console.WriteLine(transcriptions);
return transcriptions;
}

По сути, скрипт Python возвращает список, который затем сохраняется в C#. Здесь все работает отлично при запуске, без ошибок!
Проблема возникает, когда приложение запускается после предположительного завершения выполнения этого класса. Если я позволю ему поработать 10-15 минут после завершения этого блока, я получу ошибку

Код: Выделить всё

System.InvalidOperationException: GIL must always be released, and it must be released from the same thread that acquired it.
at Python.Runtime.Py+GILState()+Finalize()
Ошибка возникает внутри кода PythonNet, поэтому я не уверен, в чем на самом деле проблема.
Я попробовал переместить все в другой блок используется (var gil = Py.GIL()){}, я пробовал gil.Dispose(), я пытался создать деструктор для класса, который включал бы оба gil.Dispose( ) и PythonEngine.Shutdown(), а также я попробовал добавить PythonEngine.BeginAllowThreads() на первом этапе выше. Я не уверен, что правильно понимаю, где выдается ошибка и что именно ее вызывает. Ничего из того, что я пробовал до сих пор, не помогло, поэтому мне бы очень хотелось, чтобы вам помогли!

Подробнее здесь: https://stackoverflow.com/questions/783 ... pts-from-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»