在C#环境中动态调用IronPython脚本(二)
一、Python数据类型与C#数据类型的对应
Python中数据类型中的简单类型,例如int,float,string可以对应到C#环境中的int32,double,string,这些对应比较直观,Python中的复杂数据类型,例如List,Set等是C#环境中没有的,好在IronPython提供了这些数据类型的C#接口,使我们可以在C#环境中使用它们。如下表所示。
C# Python
IronPython.Runtime.SetCollection ――― Set
IronPython.Runtime.List ―――― List
IronPython.Runtime.PythonDictionary ―― Dictionary
(本文所列出的数据类型足够使用,作为研究,可以列出其他数据类型的对应,但实际编程无此必要。)
下图是SetCollection、List和PythonDictionary的继承关系图。
笔者以为,这些接口类的作用是与Python“通信”,能够从这些封装体中取出或存入数据即可,这些数据的后处理或前处理宜采用C#环境中的“原生类”比较合适,而不要采用这些封装类中的一些特别的方法。因此这里列出这些封装类的一些基本方法(主要是存取数据方面的)。
- SetCollection主要方法
- SetCollection copy ()
- void clear ()
- IEnumerator< object > GetEnumerator ()
- int Count
- IronPython.Runtime.List主要方法
- int index (object item)
- int index (object item, int start)
- int index (object item, int start, int stop)
- void insert (int index, object value)
- void Insert (int index, object value)
- object pop ()
- object pop (int index)
- void remove (object value)
- void reverse ()
- void RemoveAt (int index)
- bool Contains (object value)
- void Clear ()
- int IndexOf (object value)
- int Add (object value)
- void CopyTo (Array array, int index)
- void CopyTo (object[] array, int arrayIndex)
- bool Remove (object item)
- int Count
- PythonDictionary主要方法
- void Add (object key, object value)
- bool ContainsKey (object key)
- bool Remove (object key)
- bool TryGetValue (object key, out object value)
- void Add (KeyValuePair< object, object > item)
- void Clear ()
- bool Contains (KeyValuePair< object, object > item)
- void CopyTo (KeyValuePair< object, object >[] array, int arrayIndex)
- int Count
这些方法与C#固有的集合类很类似,比较好用。
二、脚本错误处理
动态脚本的运行,由于有用户参于的成份,因此出错的可能性很大,脚本的解析和运行,应该包含在一个大的Try…Catch中,应用程序不应该因为脚本的错误而中断,能够给出一个友好的、有意义的出错信息,是这类程序必须考虑的问题。
1. 如果脚本编写错误(语法错误),在执行对脚本执行Execute时,产生SyntaxErrorException。
2. 脚本中,如果没有找到类或方法,产生UnboundNameException,类中未定义方法,产生 MissingMemberException,方法传入参数个数错误,产生ArgumentTypeException, 传入参数类型不对,产生TypeErrorException
3. 如果脚本运行正确,在GetVariable时,变量名字写错了,会产生MissingMemberException。
4. 脚本中没有找到方法或类UnboundNameException, 类中未定义方法MissingMemberException。
以上只列出了脚本语法错误和调用错误,未包含运行错误(例如被零除),更详细的异常信息,请查阅Ironpython的帮助文档。
在C#环境中动态调用IronPython脚本(二)的更多相关文章
- 在C#环境中动态调用IronPython脚本(一)
本文讲述用C#调用Ironpython运行环境,解析并运行动态pyhton脚本.这种情况应用在那些需要滞后规定行为的场合,例如,动态计算项(计算引擎),用户可以自定义计算内容.计算公式等. 本文的代码 ...
- C# 中静态调用C++dll 和C# 中动态调用C++dll
在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能 ...
- C#中动态调用DLL动态链接库
其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress ...
- WCF入门及在WinForm中动态调用
一.WCF入门 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序,删除系统生成的两个文件IService1.cs与Service1.svc, 添加自定义的WCF[服务文 ...
- C#中动态调用DLL动态链接库(转)
本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347). 其中要使用两个未公开的 ...
- java中怎么调用python 脚本
调用方法: import java.io.BufferedReader; import java.io.InputStreamReader; public class PythonInvoke { p ...
- 在C#中动态调用webService
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- 在C++中反射调用.NET(二)
反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...
- Windows环境下 PHP调用R脚本
写在前面的: 由于是windows平台实现的,只要保证脚本命令能在cmd控制台运行,则可以在php中利用system()实现. 注意事项: (1).保证system的路径中无汉字和空格 !! (亲身 ...
随机推荐
- 怎样控制界面控件之进度条(ProgressBar)功能
一.基础知识: 1.ProgressBar在界面文件XML中的布局: [html] <progressBar android:id="@+id/progressbar_updown&q ...
- HOG算子
原地址:http://blog.csdn.net/chlele0105/article/details/11991533 梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符,它通过计算局 ...
- 知识网之C++总结
米老师常说的一句话:构造知识网. 立即要考试了.就让我们构造一下属于C++的知识网.首先从总体上了解C++: 从图中能够了解到,主要有五部分.而当我们和之前的知识联系的话,也就剩下模板和运算符重载以及 ...
- setChecked方法触发onCheckedChanged监听器问题
有时须要在程序初始化界面时,讲有些比如toggleButton等控件依照需求勾选,此时会发现,当我setChecked时会触发onCheckedChanged监听器,导致这部分代码被调用两次.解决方法 ...
- 关于windows系统影子账户的问题
在这之前,需要大家了解几个问题,一个是SID,一个是账号的F值. Windows账户的SID 在Windows系统中,系统会为每个用户账户建立一个唯一的安全标识符(Security Identifie ...
- zoj3747(递推dp)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 题意:给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个 ...
- MySQL 全角转换为半角
序言: 用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...
- Cocos2d-x Tiled地图编辑器(一)基本使用
Tiled地图编辑器支持普通视角地图和45度角地图, 它生成的地图数据文件cocos2d-x完美的支持,Tiled地图编辑器是一个以普通使用为目标地图编辑器,它使用简单而且能够轻松地在不同的游戏引擎中 ...
- c语言来实现c++
闲来没事,看了看sqlite的源代码,突然想用c实现c++,写了例如以下demo,自我感觉不错 #include <stdio.h> #include <stdlib.h> s ...
- c++设计模式15 --组合模式
今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...