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