Search code examples
c#python.netpython-embedding

Py.GIL() is giving error pythonnet embedded python in C#


I have the following C# code:

static void Main()
        {


            string pythonpath1 = @"C:\Users\user\Documents\pynet_test\Python\Python37";
            string pythonpath2 = @"C:\Users\user\Documents\pynet_test\Python\Python37\lib";
            string envpythonhome = @"C:\Users\user\Documents\pynet_test\Python\Python37\python37.dll";


            Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", envpythonhome, EnvironmentVariableTarget.Process);
            Environment.SetEnvironmentVariable("PATH", pythonpath1, EnvironmentVariableTarget.Process);
            Environment.SetEnvironmentVariable("PYTHONHOME", pythonpath1, EnvironmentVariableTarget.Process);
            Environment.SetEnvironmentVariable("PYTHONPATH", pythonpath2, 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(DateTime.Now);

        }

The error I am getting is:

System.MissingMethodException
  HResult=0x80131513
  Message=Method not found: 'System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'.
  Source=Python.Runtime
  StackTrace:
   at Python.Runtime.CodeGenerator..ctor()
   at Python.Runtime.DelegateManager..ctor()
   at Python.Runtime.PythonEngine.Initialize(IEnumerable`1 args, Boolean setSysArgv, Boolean initSigs)
   at Python.Runtime.PythonEngine.Initialize(Boolean setSysArgv, Boolean initSigs)
   at Python.Runtime.PythonEngine.Initialize()
   at Python.Runtime.Py.GIL()
   at WrapperPython.Program.Main() in C:\Users\user\Documents\pynet_test\pynet_test\Program.cs:line 50

The Python environment is in the Project folder and this is the following specifications:

python version used : 3.7 (x64)

pythonnet version: 2.5.2-cp37-cp37m-win_amd64

OS : Windows Server 2019

Reference has been made to the python.Runtime.dll under site-packaged. CSproj looks like following:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
      <LangVersion>latest</LangVersion>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="Python.Runtime">
      <HintPath>..\Python\Python37\Lib\site-packages\Python.Runtime.dll</HintPath>
    </Reference>
  </ItemGroup>


</Project>

I have tried everything provided online but can't seem to find the issue. I have a hunch it's based on the environment variables but not sure how to proceed.


Solution

  • okay so python.net installation is really not well documented and the folks maintaining the python.net repository don't really help a lot since it's not a "support forum".

    I solved this issue by installing the python.runtime.AllPlatflorms nuget package and pointing the environment variables to the right python folders/ files.

    This works with python3.8 as well.