在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的路径中无汉字和空格 !! (亲身 ...
随机推荐
- MySQL错误:You are using safe update mode and you tried to update a table without a WHERE that uses a K
转载自:http://blog.csdn.net/dragonpeng2008/article/details/7279590 Error: 1175 SQLSTATE: HY000 (ER_UPDA ...
- ACdream 1135(MST-最小生成树边上2个值,维护第一个最小的前提下让还有一个最小)
F - MST Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatu ...
- hadoop深入研究:(七)——压缩
转载请标明出处:hadoop深入研究:(七)——压缩 文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来了解下 ...
- 算法起步之动态规划LCS
原文:算法起步之动态规划LCS 前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素 ...
- poj2826(线段相交)
传送门:An Easy Problem?! 题意:用两条线段接雨水,雨水是垂直落下的,问我们用给定的两条线段能接到多少水. 分析:看起来很简单,写起来略麻烦,先排除不能接到水的情况: 1. 两条线段不 ...
- A股市场暴跌背后的三大元凶?
周一两市低开低走,盘中空方连续打压股指,大盘一路下行,沪指2000点关口告急,收于1963.24点,跌幅超过了5%.行业板块全线溃败.银行.证券领衔大幅杀跌,板块跌幅一度超过5%:继上周五中国石油A股 ...
- VSTO学习笔记(十五)Office 2013 初体验
原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...
- 浅谈OCR之Onenote 2010
原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...
- Fashion Meets Finance聚会来袭-7月19日 北京
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjEzMjMyMQ%3D%3D&appmsgid=10000704&itemidx= ...
- 智能指针 shared_ptr 解析
近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM @HQU s ...