博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IronPython教程
阅读量:6367 次
发布时间:2019-06-23

本文共 2457 字,大约阅读时间需要 8 分钟。

  hot3.png

最近做一个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调过去,是可以过去的。

111722_7JuG_3031369.png

 

转载于:https://my.oschina.net/uwith/blog/1529563

你可能感兴趣的文章
为了OCP英特尔拼了,一大波新科技正在路上
查看>>
前白宫反恐首席顾问:NSA可以破解圣贝纳迪恐怖份子所有的iPhone
查看>>
Java最小堆解决TopK问题
查看>>
100万的大数据人才缺口,谁来解决?
查看>>
商标转让和域名转让的区别是什么?
查看>>
《数值分析(原书第2版)》—— 1.1 二分法
查看>>
Instor公司发布一款免费的数据中心成本估算工具
查看>>
公交监控系统之弊须有人出来认头
查看>>
STiD推出两款UHF RFID标签,适用于航空航天、石油等行业
查看>>
注意五大问题,避免CRM低效问题
查看>>
物联网将如何塑造未来的网络
查看>>
大连应探索适合智慧城市建设运营模式
查看>>
对Gartner发布2017年十大技术趋势的分析
查看>>
宜城运用大数据严查惠民政策落实问题
查看>>
智能语音推动物联网应用落地
查看>>
Java 8的6个问题
查看>>
国家能源局亮配额制家底:弃光或缓解?
查看>>
Qt之高级网络操作(HTTP/FTP快速上手)
查看>>
《Hadoop集群与安全》一1.1 选择Hadoop集群硬件
查看>>
Debian 考虑重新加入 FFmpeg
查看>>