使用pythonnet从.Net Core调用python脚本

时间:2018-12-05 08:39:31

标签: c# python .net .net-core python.net

我正试图让pythonnet在运行在Linux上的.Net Core应用程序中工作。

我在.Net Core项目中引用了 Python.Runtime.dll (从nuget获得)。

我的代码是:

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"

试图在这些线程中找到解决方案,但没有任何运气:

How do I run a py file in C#?

Call Python from .NET

更新:

我试图在Visual Studio中打开\ pythonnet-master \ src \ runtime ** Python.Runtime.csproj **,以查看是否可以将其编译为.Net或.Core,但是我只能编译为.Net框架。 我发现本文“ How to port from .net framework to .net standard” 那是我要做的吗?

2 个答案:

答案 0 :(得分:0)

我终于通过使用自编译的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. 在您的Visual Studio .NET Core项目(我的目标为bin\netstandard2.0\Python.Runtime.dll)中,使用内置的DLL netcoreapp2.2作为DLL引用,例如结合以下代码

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);
                }
            }
        }
    }
}

答案 1 :(得分:0)

您可以在.NET应用程序中直接托管IronPython解释器。例如,使用NuGet,您可以下载正确的包,然后将脚本执行(实际上是IronPython引擎)直接嵌入到您的应用程序中。

参考: https://medium.com/better-programming/running-python-script-from-c-and-working-with-the-results-843e68d230e5