从c#(.NET)调用Python函数

我有Visual Studio 2015,我的主要表单用C#编写,从那里我有不同的用Python编写的类(普通的Python而不是Iron Python)。 如何从C#代码中调用Python函数?

我知道有很多关于此的主题但是大多数都太旧了,有些解决方案太难或者涉及使用像C ++这样的中间语言。

以下是我发现有用的一些链接,但未提供我正在搜索的答案:

  • stackoverflow.com/questions/6624503/call-python-from-net

  • stackoverflow.com/questions/27075671/calling-python-from-net-via-c-bridge

有一个简单的方法还是我还需要一个解决方法? 如果我需要一个解决方法,那么最简单的是什么?

您可以通过命令行调用所有内容

System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; startInfo.FileName = "cmd.exe"; startInfo.Arguments = "python whatever"; process.StartInfo = startInfo; process.Start(); 

或者甚至更好,只需调用Python.exe并传递py文件作为其参数:

 System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; startInfo.FileName = "Python.exe"; startInfo.Arguments = "yourfile.py"; process.StartInfo = startInfo; process.Start(); 

建议的方法是使用IronPython 。 还有另一个答案,它涉及使用IronPython从C#访问Python代码的基础知识: 如何从C#中的Python脚本调用特定的方法?

如果IronPython不是一个选择,正如你所提到的,你可以从命令行运行该函数并根据需要传入参数,但是对于任何复杂的事情,这可能会变成意大利面。 下面是直接从命令行在模块中运行python函数的基本示例:

 python -c 'import foo; print foo.hello()' 

所以在C#中运行上面的代码:

 System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; startInfo.FileName = "python.exe"; startInfo.Arguments = "-c import foo; print foo.hello()"; process.StartInfo = startInfo; process.Start(); 

请注意,如果您尝试返回返回值,则在这种情况下,您必须将数据打印到控制台,然后根据需要序列化C#的输出。 如果函数自己向控制台输出任何内容,这可能会有问题,除非您将其过滤掉或者有一个选项来抑制该函数的输出。