我有Visual Studio 2015,我的主要表单用C#编写,从那里我有不同的用Python编写的类(普通的Python而不是Iron Python).如何从C#代码中调用Python函数?
我知道有很多关于此的主题但是大多数都太旧了,有些解决方案太难或者涉及使用像C++这样的中间语言.
以下是我发现有用的一些链接,但没有提供我正在搜索的答案:
有一个简单的方法还是我还需要一个解决方法?如果我需要一个解决方法,那么最简单的是什么?
推荐的方法是使用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# 的输出。如果该函数自行向控制台输出任何内容,则这可能存在潜在问题,除非您将其过滤掉或有一个选项可以抑制该函数的输出。
您可以通过命令行调用所有内容
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)