Я пытаюсь включить пример сценария (приведенный в 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?