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

Mor*_*nis 10 .net c# python

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

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

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

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

Ben*_*est 5

推荐的方法是使用IronPython。还有另一个答案涵盖了使用 IronPython 从 C# 访问 Python 代码的基础知识:How do I call a specific Method from a Python Script in C#?

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

python -c 'import foo; print foo.hello()'
Run Code Online (Sandbox Code Playgroud)

所以要在 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();
Run Code Online (Sandbox Code Playgroud)

请注意,如果您尝试获取返回值,在这种情况下,您必须将数据打印到控制台,然后按照您认为合适的方式序列化 C# 的输出。如果该函数自行向控制台输出任何内容,则这可能存在潜在问题,除非您将其过滤掉或有一个选项可以抑制该函数的输出。


Yar*_*Yar 5

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

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();
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,只需调用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();
Run Code Online (Sandbox Code Playgroud)

  • 我认为 OP 正在寻找调用特定函数的解决方案,而不仅仅是执行脚本 (2认同)
  • @AlexanderMiles 过程仍然相同。你可以调用`python -c'import foo; 通过 `System.Diagnostics.Process` 打印 foo.hello()'` 命令 (2认同)
  • 在 https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee 上有一篇写得很好的 2015 文章,它使用了 @Yar 的第二种方法。它还包括发送您的 Python 脚本参数并在您的 C# 应用程序中捕获其输出。 (2认同)