如何在 Service Fabric 应用程序中 运行 pythonnet (Keras.Net)?

How do I run pythonnet (Keras.Net) in a Service Fabric Application?

TLDR:如何在 Microsoft Service Fabric 应用程序中 运行 pythonnet

我想在 C# 中使用 Keras.Net 到 运行 Python 训练的 ML 模型,但我在 Service Fabric 应用程序中执行此操作时遇到问题。我正在 运行 在我的主机上安装一个 Service Fabric 本地集群。我还在这台主机上安装了 python。 运行 Keras.Net 主机上的 C# 控制台应用程序中的代码似乎工作正常,但是 运行 在主机上的 SF 应用程序中使用相同的代码我收到以下错误:

System.AggregateException: One or more errors occurred. (One or more errors occurred. (Unable to load DLL 
'python38' or one of its dependencies: The specified module could not be found. (0x8007007E)))
---> System.AggregateException: One or more errors occurred. (Unable to load DLL 'python38' or one of its dependencies: The specified module could not be found. (0x8007007E))
---> System.DllNotFoundException: Unable to load DLL 'python38' or one of its dependencies: The specified module could not be found. (0x8007007E)
    at Python.Runtime.Runtime.Py_IsInitialized()
    at Python.Runtime.Runtime.Initialize(Boolean initSigs)
    at Python.Runtime.PythonEngine.Initialize(IEnumerable1 args, Boolean setSysArgv, Boolean initSigs)
    at Python.Runtime.PythonEngine.Initialize(Boolean setSysArgv, Boolean initSigs)
    at Python.Runtime.PythonEngine.Initialize()
    at Keras.Keras.InstallAndImport(String module)
    at Keras.Keras.c.b__27_0()
    at System.Lazy1.ViaFactory(LazyThreadSafetyMode mode)
    at System.Lazy1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
    at System.Lazy1.CreateValue()
    at System.Lazy1.get_Value()
    at Keras.Keras.get_Instance()
    at Keras.Models.BaseModel.ModelFromJson(String json_string)

这似乎是一个简单的路径问题,但我已经检查过环境在 C# 控制台应用程序和 SF 应用程序中具有相同的值(在 visual studio 中调试时)。

我是不是用错了方法? SF Cluster Node可以访问主机上的python安装吗?

我建议使用 Docker 容器将您的应用程序及其先决条件打包在一起,因此它 运行 几乎可以在任何能够 运行 容器的主机上运行。

这样一来,如果它可以在您的机器上运行,那么它也可以在托管集群上运行。它还可以避免在节点上安装工具的需要,使它们更像 'cattle' 而不是“pets”。

更多信息here

由于 Service Fabric 本地集群 运行 是主机上的虚拟集群,在主机上安装软件并不自动意味着虚拟集群中的节点可以访问它们。

为了 运行 Python 在 SF 上,它必须安装在集群本身的节点上。 演示了如何执行此操作。

话虽这么说,但我会遵循@LoekD () 关于容器化的建议。