最近由于项目设计,有部分使用Python脚本,所以代码中须要调用python方法。python
1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codeplex.com/ 中下载json
2.对应用程序添加IronPython.dll和Microsoft.Scripting.dll 的引用c#
3.调用python:dom
using System; using System.Collections.Generic; using System.Linq; using System.Text; using IronPython.Hosting; using Microsoft.Scripting.Hosting; namespace WpfUsingPythonDemo { public class UsingPython { private ScriptRuntime pyRuntime = null; private dynamic obj = null; public UsingPython() { string serverpath = AppDomain.CurrentDomain.BaseDirectory + "frs_main.py";//所引用python路径 pyRuntime = Python.CreateRuntime(); ScriptEngine Engine = pyRuntime.GetEngine("python"); ScriptScope pyScope = Engine.CreateScope(); //Python.ImportModule(Engine, "random"); obj = Engine.ExecuteFile(serverpath, pyScope); } public bool ExcutePython() { try { if (null != obj) { obj.frs_init();//调用frs_main.py中的方法 } else { return false; } return true; } catch(Exception ex) { throw ex; } } } }
4.c#中引用的python应该是IronPython,与CPython版本和模块中有差异,因此须要注意使用版本ide
5.由于所使用的python文件中引用了不少模块,因此运行时会找不到python库,在网上查了一下,须要引入搜索路径而且引入库,以下:spa
public UsingPython() { string serverpath = AppDomain.CurrentDomain.BaseDirectory + "frs_main.py";//所引用python路径 pyRuntime = Python.CreateRuntime(); ScriptEngine Engine = pyRuntime.GetEngine("python");
//手动设置搜索路径 ICollection<string> Paths = Engine.GetSearchPaths(); Paths.Add("//Lib"); Paths.Add("//Lib//site-packages"); Paths.Add(AppDomain.CurrentDomain.BaseDirectory + "frs"); //importpy文件中的库,须要注意前后引用顺序 Engine.ImportModule("sys"); Engine.ImportModule("logging"); Engine.ImportModule("Queue"); Engine.ImportModule("ctypes"); Engine.ImportModule("json"); Engine.ImportModule("os"); ScriptScope pyScope = Engine.CreateScope(); //Python.ImportModule(Engine, "random"); obj = Engine.ExecuteFile(serverpath, pyScope); }
这是本身摸索找到的解决方案,但愿之后能够有更好的方法。设计