文档章节

IronPython教程

朝如青丝暮成雪
 朝如青丝暮成雪
发布于 2017/09/05 19:59
字数 883
阅读 205
收藏 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调过去,是可以过去的。

 

© 著作权归作者所有

共有 人打赏支持
朝如青丝暮成雪
粉丝 4
博文 68
码字总数 28132
作品 0
浦东
程序员
C#脱离IronPython中执行python脚本

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

gsbhzh
2014/12/27
0
0
IronPython通过pypyodbc使用SQLAlchemy的方法

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

派派技术小组
2013/03/07
0
0
IronPython和C#交互

http://www.cnblogs.com/xukun588/ IronPython和C#交互 IronPython是一个.NET平台上的Python实现,包括了完整的编译器、执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起。 IronPyth...

仰望星空_588
08/11
0
0
各种 Python 实现的简单介绍与比较

(点击上方公众号,可快速关注) 编译:Daetalus http://python.jobbole.com/82703/ 当谈到Python时,一般指的是CPython。但Python实际上是一门语言规范,只是定义了Python这门语言应该具备哪...

Python开发者
04/25
0
0
请问使用vs2015开发wpf,用ironpython怎样连接access数据库

请问下在vs2015里面使用wpf用ironpython怎样连接access数据库

小yan
06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一次由HandlerInterceptor进行的深入思考

HandlerInterceptor 是SpringFramework为我们提供的拦截器,一般我们可以用来鉴权或者日志记录等。 它是一个interface,主要方法有: /** * Intercept the execution of a handler. Called...

kipeng300
30分钟前
1
0
cmd中查询mysql表出现中文乱码

问题:在pycharm中正常的fetchall拉取数据,能够正常显示,而在cmd中直接select却出现中文乱码。 解决思路:右键查看cmd命令窗口属性得到,cmd窗口默认编码是gbk(如下图所示),而设置的mys...

fang_faye
56分钟前
2
0
centOS 安装Python3与python2并存

centOS 安装Python3与python2并存 如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环...

MedivhXu
今天
2
0
Spring JdbcTemplate模板模式与回调结合分析

在看Spring的JdbcTemplate的时候,看到其将模板模式和回调模式结合使用的实现,可以精妙的解决很多的问题。详见Spring中涉及的设计模式总结中的关于模板模式和回调模式结合的具分析,本文利用...

宸明
今天
1
0
docker update:更新一个或多个容器的配置

更新容器的配置 docker update:更新一个或多个容器的配置。 具体内容请访问:https://docs.docker.com/engine/reference/commandline/update/#options 语法:docker update [OPTIONS] CONTA...

lwenhao
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部