文档章节

IronPython教程

朝如青丝暮成雪
 朝如青丝暮成雪
发布于 2017/09/05 19:59
字数 883
阅读 255
收藏 0

最近做一个Python和C#的交互写个记录

#coding=utf-8    加上这个python支持中文

python调用C#中的方法

import clr;

#加载DLL文件三种方式
#clr.AddReference("Python.Core")
#clr.AddReferenceToFile("Python.Core.dll");
clr.AddReferenceToFileAndPath("D:\\Python.Core.dll");
#导入命名空间
from test import FuncOfPython;

如果是静态方法就可以直接FuncOfPython.Test()来调用

实例成员的话

pythonTest=test();

pythonTest.Test()

最开始是使用Nuget安装的IronPython,这样安装没有基本类库,后来去官网下载安装,然后引用DLL。

        public static dynamic ExcutePython(string algorithm, string pyStr, string funName, dynamic par)
        {
            //判断是否存在字典中
            if (!scriptDic.ContainsKey(algorithm))
            {
                //创建Python引擎,DLR 动态语言执行类,用于解析和执行动态脚本
                ScriptEngine engine = Python.CreateEngine();
                //设置基本类库的路径
                ICollection<string> paths = engine.GetSearchPaths();
                paths.Add(@"D:\工具安装\IronPython-2.7.5\Lib");
                engine.SetSearchPaths(paths);
                //创建一个执行上下文,其中保存了环境及全局变量。宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。
                ScriptScope scope = engine.CreateScope();
                //操控动态语言代码的类型,我们可以编译(Compile)、读取(Read Code Lines)或运行(Execute)代码。
                ScriptSource source = engine.CreateScriptSourceFromString(pyStr);
                //运行输入脚本
                dynamic context = source.Execute(scope);
                Tuple<ScriptEngine, ScriptScope, ScriptSource> temp = Tuple.Create<ScriptEngine, ScriptScope, ScriptSource>(engine, scope, source);
                scriptDic.Add(algorithm, temp);
            }
            //从字典中取出
            Tuple<ScriptEngine, ScriptScope, ScriptSource> script = scriptDic[algorithm];
            //调用方法,并传参数
            Func<dynamic, dynamic> result = script.Item2.GetVariable<Func<dynamic, dynamic>>(funName);
            return result(par);
        }

上面是我封装的方法动态执行脚本。

其实也可以context.你脚本中的方法来执行也是没有问题的

注意要版本一致,不一致也会出现这个问题,我是Nuget安装的2.7.7版本,然后去官网下载2.7.7版本的mis文件,安装完事,可以直接引用第三方包

第三方包踩坑:

编写的文件打印出来的地址与安装标准包安装地址不匹配,导致引入第三方会报错

No module named random

后来查下资料,打印出来的路径指向是我程序路径,修改下就好了,打印路径方法

#打印第三方包路径
#import sys
#print sys.path

设置第三方包路径的相关代码

                //设置第三方包路径
                List<string> Paths = new List<string>();
                Paths.Add(PythonPackage);
                engine.SetSearchPaths(Paths);

这样就可以引用安装的python标准包了。

但是有个地方,没有弄明白,如果是解压版的IronPython,引用第三方包如果不是.py文件,比如time模块,这种是c写的包,解压版本引入会报错,引入不了,如果安装版本的IronPython,就可以引用。

踩坑2:

IronPython random 随机数模块存在个问题,生成的随机数不会超过设定值的一半,比如:

import random
random.randint(0,4)

生成的随机数会出现0,1,2永远不会出现3,4,原因未知。

解决方案1:既然是一半,就*2

解决方案2:调用c#的Random类来实现

import System
from System import Random
r=Random()
r.Next(0,100)

踩坑3:

在练习的时候发现一个问题,调试模式下运行py,其中调用C#中的类,例如from System import Math,会一直报一个错误,IronPython.Runtime.Exceptions.ImportException not a Zip file,很奇怪为什么出现,后来找遍国内资源没有找到,后来在国外一网站发现一小伙也有这个问题,然后茅塞顿开,出现这个问题是仅在调试模式出现,直接运行是没有这个问题的,出现这个错误多按几次F5调过去,是可以过去的。

 

© 著作权归作者所有

共有 人打赏支持
朝如青丝暮成雪
粉丝 5
博文 71
码字总数 31287
作品 0
浦东
程序员
私信 提问
IronPython 2.7.1 发布

IronPython 2.7.1最大的改进是支持unicodedata, csv和ats三个模块。其它的标准库模块也同步到CPython 2.7.2。另外修复了很多BUG,与CPython更加兼容。现在,IronPython Tools for Visual Stu...

老枪
2011/11/24
879
0
IronPython通过pypyodbc使用SQLAlchemy的方法

SQLAlchemy是目前在Python界大热的技术,但由于IronPython数据库接口库的缺乏,IronPython却一直无法使用此神器。 现在,借助于纯Python的ODBC接口库pypyodbc,通过简单扩展SQLAlchemy,Iro...

派派技术小组
2013/03/07
0
0
C#脱离IronPython中执行python脚本

给客户安装程序时除了安装.net framework还要安装IronPython,是不是觉得很麻烦? 上面这一切都弱爆了,下面我来介绍一种不安装IronPython只需要引入几个IronPython的dll就可以在c#中执行pyt...

gsbhzh
2014/12/27
0
0
IronPython 2.7.2 发布,.NET实现的Python语言

IronPython 2.7.2正式版本发布了。 该版本与其他2.7系列版本一样,需要安装.NET 4。不同的是,该版本的安装包和Platforms目录中的zip包中包含了所有支持平台相关的程序集。该版本支持.NET 3....

红薯
2012/03/13
2.5K
4
IronPython 2.0.1发布

IronPython 2.0.1发布了,IronPython是用.NET实现Python语言的项目。 新版本在性能有了很大改进,并且继续向后兼容。 IronPython 开发团队对性能做了一系列测试,测试结果: PyStone 1.1 性能...

红薯
2009/02/27
299
0

没有更多内容

加载失败,请刷新页面

加载更多

Caffe(二)-Python-自定义网络

这里我们用一个例子先来体验一下 首先定义一下我们的环境变量 $PYTHONPATH,我这儿是Windows开发环境,至于Windows Caffe怎么编译由读者自己下去搞定 我使用的控制台是 Windows PowerShell 添...

Pulsar-V
29分钟前
2
0
ActiveMQ从入门到精通(二)之可靠性机制

ActiveMQ的可靠性机制 缘由( 确认JMS消息) 只要消息被确认之后,才认为消息被成功消费了。消息的成功消费包括三个阶段:客户端接收消息、客户端处理消息以及客户端确认消息。在事务性会话中...

一看就喷亏的小猿
37分钟前
0
0
源码分析 Mybatis 的 foreach 为什么会出现性能问题

背景 最近在做一个类似于综合报表之类的东西,需要查询所有的记录(数据库记录有限制),大概有1W条记录,该报表需要三个表的数据,也就是根据这 1W 个 ID 去执行查询三次数据库,其中,有一...

TSMYK
今天
7
0
IC-CAD Methodology企业实战之openlava

在云计算解决安全问题并成为IC界主流运算平台之前,私有的服务器集群系统仍然是各大IC公司的计算资源平台首选。 现在主流的服务器集群管理系统包括lsf,openlava,SkyForm,三者都属于lsf一系...

李艳青1987
今天
5
0
http response stream 字节流 接收与解码

在接收图片、音频、视频的时候,需要用到二进制流。 浏览器会发给客户端 字节Byte流,一串串的发过来_int8格式 -128~127(十进制),也就是8bit(位)。 客户端接收的时候,对接收到的字节收集,...

大灰狼wow
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部