Запуск Python 3.7 из C# с использованием Python. NET - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь включить пример сценария (приведенный в README.md) в тестовый код C# в Visual Studio 2019. Я использую Python virtualenv .

Некоторая информация о моей среде:

  • Pytho nnet версия: pythonnet-2.4.0-cp37-cp37m-win_amd64.whl
  • Python версия: Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]
  • Операционная система : Windows 10 64-bit

Прежде всего, я создал совершенно новый virtualenv и установил пакет, пока numpy.

mkvirtualenv pynet
workon pynet
pip3 install numpy
pip3 install pythonnet

Это был результат для pythonnet:

Collecting pythonnet
  Using cached pythonnet-2.4.0-cp37-cp37m-win_amd64.whl (70 kB)
Installing collected packages: pythonnet
Successfully installed pythonnet-2.4.0

Я создал пример проекта Visual Studio 2019. Первым делом я снял галочку с Properties -> Build -> Prefer 32-bit, затем добавил к ссылке Python.Runtime.dll, в моем случае он был ниже C:\Users\andrea\Envs\pynet\Lib\site-packages\Python.Runtime.dll. Затем я создал следующий пример сценария:

using Python.Runtime;
using System;
using System.Collections.Generic;

namespace WrapperPython
{
    class Program
    {
        static void Main()
        {
            var pythonPath = @"C:\Users\andrea\Envs\pynet\Scripts";
            //var pythonPath = @"C:\Users\andrea\AppData\Local\Programs\Python\Python37";

            Environment.SetEnvironmentVariable("PATH", $@"{pythonPath};" + Environment.GetEnvironmentVariable("PATH"));
            Environment.SetEnvironmentVariable("PYTHONHOME", pythonPath);

            Environment.SetEnvironmentVariable("PYTHONPATH ", $@"{pythonPath}\..\Lib;{pythonPath}\..\Lib\site-packages;");
            //Environment.SetEnvironmentVariable("PYTHONPATH ", $@"{pythonPath}\Lib");

            PythonEngine.PythonHome = Environment.GetEnvironmentVariable("PYTHONHOME", EnvironmentVariableTarget.Process);
            PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);

            using (Py.GIL())
            {
                dynamic np = Py.Import("numpy");
                Console.WriteLine(np.cos(np.pi * 2));

                dynamic sin = np.sin;
                Console.WriteLine(sin(5));

                double c = np.cos(5) + sin(5);
                Console.WriteLine(c);

                dynamic a = np.array(new List<float> { 1, 2, 3 });
                Console.WriteLine(a.dtype);

                dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);
                Console.WriteLine(b.dtype);

                Console.WriteLine(a * b);
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadLine();
        }
    }
}

Но я получаю следующее сообщение в открытое приглашение:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00003504 (most recent call first):

И затем оно завершается с ошибкой:

'WrapperPython.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
'WrapperPython.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\Users\andrea\Documents\Personali\visual studio\WrapperPython\bin\Debug\WrapperPython.exe'. Symbols loaded.
'WrapperPython.exe' (CLR v4.0.30319: WrapperPython.exe): Loaded 'C:\Users\andrea\Documents\Personali\visual studio\WrapperPython\bin\Debug\Python.Runtime.dll'. 
'WrapperPython.exe' (CLR v4.0.30319: WrapperPython.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'. 
'WrapperPython.exe' (CLR v4.0.30319: WrapperPython.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'. 
'WrapperPython.exe' (CLR v4.0.30319: WrapperPython.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll'. 
'WrapperPython.exe' (CLR v4.0.30319: WrapperPython.exe): Loaded '__CodeGenerator_Assembly'. 
The program '[28052] WrapperPython.exe' has exited with code -1073740791 (0xc0000409).

Это такой простой пример, что я не могу понять, что могло пойти не так.


ОБНОВЛЕНИЕ : Кажется, проблема только в virtualenv. Я выполнил ту же настройку для «глобальной» установки python, и она работает. Просто переключая закомментированные строки в пути из предыдущего примера, это работает.

Как я могу заставить его работать внутри virtualenv?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...