1.功能简介
Python是一种跨平台语言。无论是在Windows、Linux、Unix还是Mac Os系统,我们都可以使用Python。甚至在Linux、Unix及Mac OS系统内已经集成了Python。语法简洁优美, 简单,易学。拥有强大的标准库及第三方库。本示例程序实现了Python算法与PIESDK集成功能,使得在PIE中也可以调用Python写的算法(以Python图像裁剪算法为例,使用了ArcGIS的arcpy库)。
2. 功能实现说明
2.1. Python算法
2.2. 实现思路及原理说明
Python写的算法是一个*.py文件,我们可以通过直接给Main函数传参来调用,也可以使用IronPython库使Python与C#结合,达到直接调用Python函数的目的。本示例实现方法主要使用第一种(第二种方法IronPython库,直接添加引用即可,详见示例程序)。
Python算法往往使用了很多第三方库,在调用时需要先把三方库的路径添加到sys.path中,需要注意的是,若使用IronPython,有些非Python语言写的文件如(*.pyd)无法被识别,import时会报错(如本示例第二种方法,arcgisscripting.pyd加载报错),这时只能使用Main函数方法。
方法一:通过Main传参
第一步 |
New一个进程对象 |
第二步 |
设置进程执行程序为python.exe |
第三步 |
构造参数,将算法文件(.py)和算法参数一并传入,以空格间隔。 |
第四步 |
启动进程 |
方法二:使用IronPython
第一步 |
创建脚本引擎对象ScriptEngine |
第二步 |
添加python搜索路径(若需要) |
第三步 |
创建scope并导入python脚本文件 |
第四步 |
构造算法需要的参数 |
第五步 |
执行算法 |
2.3 核心接口与方法
接口/类 |
方法 |
说明 |
ScriptEngine |
CreateScriptSourceFromFile |
导入Python脚本 |
ScriptScope |
GetVariable () |
获取脚本中的方法 |
ScriptEngine |
SetSearchPaths() |
设置python搜索路径 |
2.4. 示例代码
项目路径 |
百度云盘地址下/PIE示例程序/14.SDK拓展开发/ 03PIESDK与Python结合/ BlendWithPython |
数据路径 |
百度云盘地址下/PIE示例数据/栅格数据/ |
示例代码 |
|
1 /// Python图像裁剪 2 /// </summary> 3 /// <param name="sender"></param> 4 /// <param name="e"></param> 5 private void ImgClip_ToolStripMenuItem_Click (object sender, EventArgs e) 6 { 7 ImageClipForm form = new ImageClipForm(); 8 if (form.ShowDialog() != DialogResult.OK) return; 9 //启动一个进程 10 System.Diagnostics.Process p = new System.Diagnostics.Process(); 11 p.Exited += p_Exited; 12 p.StartInfo.UseShellExecute = false; 13 p.StartInfo.RedirectStandardOutput = true;//重定向输出 14 p.StartInfo.RedirectStandardError = true; 15 //启动python.exe 16 p.StartInfo.FileName = System.IO.Path.Combine(Application.StartupPath, 17 "../../../../../Python/python.exe"); 18 p.StartInfo.CreateNoWindow = true; 19 20 /*-------------*/ 21 //此算法依赖ArcGIS,需先安装ArcGIS 22 /*-------------*/ 23 p.StartInfo.Arguments = System.IO.Path.Combine(Application.StartupPath , "test.py") +" "+ form.InputFileName + " " + form.ExtentFileName + " " + form.OutputFileName; ;//参数以空格分隔,如果某个参数为空,可以传入”” 24 p.EnableRaisingEvents = true; 25 p.Start(); 26 } 27 28 //***********************************// 29 // 此方法不需要python.exe,只需要 30 // 引用IronPython库,相对上面方法更方便。 31 // 但是某些情况下import时找不到moudle(如*.pyd) 32 //**********************************// 33 private void ImgClip_ToolStripMenuItem_Click2(object sender, EventArgs e) 34 { 35 //裁剪窗体 36 FormImageClip form = new FormImageClip(); 37 if (form.ShowDialog() != DialogResult.OK) return; 38 39 //(方法1)创建脚本运行时 40 //ScriptRuntime pyRuntime = Python.CreateRuntime(); 41 //if (pyRuntime == null) return; 42 //dynamic py = pyRuntime.UseFile(System.IO.Path.Combine( Application.StartupPath , "test.py")); 43 //object a = py.ImageClip(input,ext,output);//ImageClip()为脚本中的一个函数 44 45 //(方法2)创建脚本引擎 46 ScriptEngine pyEngine = Python.CreateEngine(); 47 pyEngine.Runtime.IO.RedirectToConsole();//重定向 48 49 //添加搜索路径 50 var paths = pyEngine.GetSearchPaths(); 51 paths.Add(@"D:Program Files (x86)ArcGISDesktop10.2arcpy"); 52 paths.Add(@"D:Program Files (x86)ArcGISDesktop10.2in"); 53 pyEngine.SetSearchPaths(paths); 54 55 //创建一个scope 56 var scope = pyEngine.CreateScope(); 57 //从文件创建脚本源码 58 var source = pyEngine.CreateScriptSourceFromFile( 59 System.IO.Path.Combine(Application.StartupPath, "test.py")); 60 //执行代码 61 source.Execute(scope); 62 63 //获得代码中的函数 64 var ImageClip = scope.GetVariable<Func<object, object, object, object>>("ImageClip"); 65 //调用ImageClip函数 66 object a = ImageClip(form.InputFileName, form.ExtentFileName, 67 form.OutputFileName); 68 MessageBox.Show(a.ToString()); 69 } |