Вызов скрипта python из .Net Core с использованием pythonnet - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь заставить pythonnet работать в моем приложении .Net Core, работающем под Linux.

Я сделал ссылку на Python.Runtime.dll (которую я получилиз nuget ) в моем проекте .Net Core.

Мой код:

using System;
using Python.Runtime;
namespace pythonnet_w
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start");
            using (**Py.GIL()**) {
            //     blabla
            }
            Console.WriteLine("End");
        }
    }
}

Я получаю эту ошибку времени выполнения:

 Unhandled Exception: System.MissingMethodException: Method not found:     'System.Reflection.Emit.AssemblyBuilder      
 System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'.
    at Python.Runtime.CodeGenerator..ctor()
    at Python.Runtime.DelegateManager..ctor()
    at Python.Runtime.PythonEngine.Initialize(IEnumerable`1 args, Boolean setSysArgv)
    at Python.Runtime.PythonEngine.Initialize(Boolean setSysArgv)
    at Python.Runtime.PythonEngine.Initialize()
    at Python.Runtime.Py.GIL()
    at pythonnet_w.Program.Main(String[] args) in D:\Development\~.Net libraries (3.part)\phytonnet\.Net Core test (phytonnet)\c#\pythonnet_test\Program.cs:line 10
 /usr/sbin/pythonnet_w: line 5: 19487 Aborted                 dotnet "/usr/share/pythonnet_wit/pythonnet_w.dll"

Пытался найти решение в этих темах, но безуспешно:

Как запустить py-файл в C #?

Вызов Python из .NET

ОБНОВЛЕНИЕ:

Я пытался открыть \ pythonnet-master \ src \ runtime ** Python.Runtime.csproj ** в Visual Studio, чтобы увидеть, если ямогу скомпилировать его в .Net или .Core, но я могу скомпилировать только.Я нашел эту статью " Как портировать с .net Framework на .net стандарт " Это то, что я должен сделать?

1 Ответ

0 голосов
/ 11 мая 2019

Я наконец-то добился успеха, используя самостоятельно скомпилированный Python.Runtime.dll начиная с версии 2.4.0.Существует два варианта создания рабочей DLL:

  • Удалите другую целевую платформу net461 из соответствующего файла проекта (оставьте только netstandard2.0).
  • Выполните dotnet buildиспользуя соответствующие параметры

Для варианта 2 работает следующее :

  1. Клонировать репозиторий Pythonnet (https://github.com/pythonnet/pythonnet)
  2. В папке pythonnet cd src\runtime
  3. Выполнить dotnet build -c ReleaseWinPY3 -f netstandard2.0 Python.Runtime.15.csproj
  4. Использовать встроенную DLL bin\netstandard2.0\Python.Runtime.dll в качестве ссылки на DLL в вашем проекте Visual Studio .NET Core (цели для шахты netcoreapp2.2),например, в сочетании со следующим кодом

using System;
using Python.Runtime;

namespace Python_CSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Py.GIL())
            {
                dynamic os = Py.Import("os");
                dynamic dir = os.listdir();
                Console.WriteLine(dir);

                foreach (var d in dir)
                {
                    Console.WriteLine(d);
                }
            }
        }
    }
}

...