今天介绍一下如何在C#侧调用Python脚本,并且做一些有趣的实验。

首先介绍一下今天的主角,IronPython,大名鼎鼎,想要了解的可以去它的官网看看相关的介绍,很带劲。IronPython.net /

新建一个C#的控制台项目,然后使用nuget安装这个IronPython组件

1

Install-Package IronPython

好了,开始学习吧。

首先我们需要理解,为什么会需求脚本?没有脚本行不行?当然行啊!但是我们可以想象一下一个需求。我们从设备获取到了一个数据,比如是 float a = 100f; 但是这个数不是最终的数,而是需要运算的,比如是要缩小10倍才是正确的数。

那么我们会  a = a / 10;  如果业务变成了会缩小N倍,这个倍数不一定,经常会调整。好了,我们就把这个倍数做成了配置项,保存在txt里,然后从txt加载倍数,然后来动态调整,这时候我们的程序已经很灵活了。

在txt里写入 10 就是缩小10倍,写入0.5就是放大两倍。OK,现在业务变得更加的复杂了!我不一定是乘除法,也可能是加减法,甚至是组合运算加减乘除法。这时候你会怎么做呢?

传统的方式,我还是做配置文件,把每种情况都罗列出来,1代表乘除法,2代表加减法,3代表什么什么,等等,每种情况再做配置文件,配置项不一样嘛。这种方式当然也可以实现,只是

1. 比较麻烦,需要写大量的配置代码,读写文件的代码。

2. 仍然适应不了未来的变化,以后可能业务又更改了,而你一开始没有考虑到,又要改源代码了,然后编译,然后部署。

ok,现在可以尝试一种全新的技术(其实脚本技术不算新),这里的新技术主要是对于刚接触的人来说。

我们针对上面的需求进行实现。

我们现在程序的debug目录下,新建一个hsl.py文件,方便我们的调用,然后我们使用VS CODE 进行编辑这个文件,关于如何安装python及配置环境啥的,可以参考下面的文章:

VS code配置python环境,配置pip源,配置国内镜像,配置PyQt5 窗体一闪而过解决办法 - dathlin - 博客园

好了,现在开始编辑了,我们需要定义一个转换的方法,如下所示

然后我们在C#里写下面的代码

1

2

3

4

5

6

7

8

9

10

11

12

13

static void Main( string[] args )

{

    float value = 123f; // 模拟我们获取到的数据

    Microsoft.Scripting.Hosting.ScriptEngine engine = IronPython.Hosting.Python.CreateEngine( );

    dynamic script = engine.ExecuteFile( "hsl.py" );

    float result = script.GetActulValue( value );

    Console.WriteLine( $"Value Old:{value}  New Value:{result}" );

    Console.ReadLine( );

}

  

我们运行起来看看,看看会输出什么?

这时候应该发出震撼的声音,我去!居然真的可以,我们在看看修改下python脚本的代码

看看结果

上述的例子太简单了,我们来看看更高级的数学方法

我们改的更高级一点了。这个数可以算出啥。我也不知道了。所以我们看看,这玩意能输出什么?

emmmmm.....报错了,python的运算之后结果变成了double类型,应该是math处理方法的原因,所以我们的C#代码要万无一失的话,稍微改改

好了,看来我们可以用一些python自己的库相关的代码,都可以执行。接下来我们看看下面的py代码

我们看看这个效果

这么看来也是没有任何问题的。

这样的话,就可以完成一些很高级的自定义的脚本操作了。

你以为到这里就结束了?接下来才是给力的部分。上述已经实现了文章开篇提出的需求了,接下来我们看看一个更高级的需求。

在C#里有五个方法。A,B,C,D,E代表了业务的五个部分,我们的主体业务是分别调用这五个方法,进行排列组合,甚至,有的不执行,或是执行多次。如果需要这种业务应该怎么办呢?

同样是脚本是最合适,我们需要在python里调用C#的这五个方法。

那么第一步就是定义这五个方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public static void A( )

{

    Console.WriteLine( "Method A Called" );

}

public static void B( )

{

    Console.WriteLine( "Method B Called" );

}

public static void C( )

{

    Console.WriteLine( "Method C Called" );

}

public static void D( )

{

    Console.WriteLine( "Method D Called" );

}

public static void E( )

{

    Console.WriteLine( "Method E Called" );

}

  很简单,只要被调用一次,就会打印出记录,方便我们跟踪。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

static void Main( string[] args )

{

    Microsoft.Scripting.Hosting.ScriptEngine engine = IronPython.Hosting.Python.CreateEngine( );

    Microsoft.Scripting.Hosting.ScriptScope scope = engine.CreateScope( );

    scope.SetVariable( "A"new Action( A ) );

    scope.SetVariable( "B"new Action( B ) );

    scope.SetVariable( "C"new Action( C ) );

    scope.SetVariable( "D"new Action( D ) );

    scope.SetVariable( "E"new Action( E ) );

    engine.ExecuteFile( "hsl.py", scope );

    Action business = scope.GetVariable<Action>( "MainBusiness" );

    business( );  // 调用主业务现实

    Console.ReadLine( );

}

  这里我们不用C#的动态语法来执行脚本了,我们通过获取委托的方式,当然了,我们先把这五个方法,传进python里面去,就可以调用了,python的代码如下,需要注意的是,方法名和上面的要一样

ok,很简单的,就是顺序调用一下而已,好了,我们现在看看输出

我去,真的可以啊,牛逼,不禁再次感叹下,来来来,我们的脚本写的更加复杂点。

我们还加入的循环体,来来来,继续看看效果。

我去,牛逼!!!

再来看看变量呢?

我们新增加一个count变量,然后传入到python脚本,看看python能不能获取到

然后我们运行C#侧的代码

可以获取到,我们现在来更改值看看

就是简单的修改一个值。

发现没有更新,那么可以推断,传入Python的值变量,只是数据的副本,那么我们应该传入引用变量

我们定义了一个匿名类型,如果这部分不清楚,就可以去补补C#的知识了。

好了,我们再运行看看

额,,,,发生异常了。这里暂时还没有想明白,不过暂时的解决可以通过返回值来解决,我们让业务方法返回数据,进行更改。如果有网友知道怎么解决,非常感谢。

运行看效果。

OK,最后我们来看看,如果我还有一个py的脚本文件。实现另一个方法,F()

我需要在上面的脚本里调用这个方法。

我们同时加载第二个文件,然后更改第一个py文件的代码

然后我们看运行效果。

ok,可以,非常好,剩下的细节就要结合实际开发了。接下来看一个例子:

我们在项目里面安装 HslCommuncation

我们在C#的代码里生成一个连接西门子的网络对象类。并且把这个类传递给Python,那么代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

static void Main( string[] args )

{

    var data = new Good (){ Name = "BooK", Price = 10 };

    Microsoft.Scripting.Hosting.ScriptEngine engine = IronPython.Hosting.Python.CreateEngine( );

    Microsoft.Scripting.Hosting.ScriptScope scope = engine.CreateScope( );

    scope.SetVariable( "Good", data );

    scope.SetVariable( "A"new Action( A ) );

    scope.SetVariable( "B"new Action( B ) );

    scope.SetVariable( "C"new Action( C ) );

    scope.SetVariable( "D"new Action( D ) );

    scope.SetVariable( "E"new Action( E ) );

    HslCommunication.Profinet.Siemens.SiemensS7Net siemens =

        new HslCommunication.Profinet.Siemens.SiemensS7Net(

            HslCommunication.Profinet.Siemens.SiemensPLCS.S1200, "192.168.8.12" );

    siemens.SetPersistentConnection( );

    scope.SetVariable( "siemens", siemens );

    engine.ExecuteFile( "hsl.py", scope );

    engine.ExecuteFile( "hsl2.py", scope );

    Func<int> business = scope.GetVariable<Func<int>>( "MainBusiness" );

    data.Price = Convert.ToInt32(business( ));  // 调用主业务现实

    Console.WriteLine( data.Price.ToString( ) );

    siemens.ConnectClose( );

    Console.ReadLine( );

}

  

然后在python里读取西门子的数据信息。然后打印出来

ok,那么我们来执行

可以,非常给力。

我们再来看看写入操作。

读出来是0,应该是写入的类型不对,那么我们需要写入的是short类型,应该怎么操作呢?

这样就可以读取到我们需要的数据了。如果我们写入的是数组呢?

我们自然而然想到:

结果报下面的错误。

意思就是两个重载的方法不知道选哪个,好了,问题知道了,我们来修复下这个内容

到这里成功写入,我们也拿到了自己的数据。

如果我需要使用 C#的类,这个类是我自己创建的话。

比如说这里的OperateResult

如果想使用线程的技术,可以使用C#的线程技术

1

from System.Threading import Thread, ThreadStart

  

1

2

3

4

5

6

7

8

9

10

11

def ThreadCheck():

    count = 0

    while True:

        count = count + 1

        time.sleep(1)

        logNet.WriteDebug('线程检测:'+ str(count))

        if count > 10:

            break

def SendMesCmdToPlc(cmd):

    Thread(ThreadStart(ThreadCheck)).Start()

就可以启动线程的检测

更详细的英文版教程如下:

https://ironpython.net/documentation/dotnet/

关于变量赋值,如果有老铁解决了,欢迎留言。

C#侧调用Python脚本 IronPython相关推荐

  1. python c#_【分享】C# 调用 Python 脚本, 与 Python 调用 C# 类库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C# 调用 Python 脚本 操作步骤 1.创建一个控制台程序. O0101_DotNetCallPython. 2.管理 Nuget 程序包,搜索 I ...

  2. java调用python脚本_调用Python写vb的脚本方法

    某个项目中涉及到这样一个情景: VB写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下所示: ...

  3. C#调用Python脚本训练并生成AI模型(以Paddle框架为例)

    目录 一. C#调用通过IronPython语言移植 1.1 IronPython安装 1.2 示例代码 1.3 运行结果 1.4 特点 二. C#调用Python文件打包dll 2.1 步骤 2.1 ...

  4. Java调用python脚本

    Java调用python脚本 最近也是刚开始学python,所以这里写了一个简单的小方法用Java来调用python脚本.后期再进行更新. 1.Java启动程序的方法 在Java中提供了两种方法来启动 ...

  5. c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法

    c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法 时间:2017-05-09 12:32:06阅读:234评论 ...

  6. excel调用python编程-如何在excel中调用python脚本

    如何在excel中调用python脚本 发布时间:2020-07-03 14:15:28 来源:亿速云 阅读:155 如何在excel中调用python脚本?针对这个问题,这篇文章详细介绍了相对应的分 ...

  7. python调用exe程序 传入参数_关于使用c#调用python脚本文件,脚本文件需要传递参数...

    最近工作中需要干这个事,网上搜了搜资料,改了改,基本是这样 建立一个控制台应用程序: 比如 加入我在命令行直接调用python脚本,命令为 y安装python后,添加环境变量,path下面,加入路径. ...

  8. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...

    我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py​​']中,并且我的Java应用程序与此Py ...

  9. 【Python】如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

最新文章

  1. 高糊图片可以做什么?
  2. 活动目录系列之三:建立子域和林中第二棵域树
  3. 计算机网络探究二之利用PHP实现登录验证之后上网
  4. iframe嵌套页面 跨域_跨域解决方案
  5. C# 视频监控系列(14):总结贴——VC++代码转成C#小结
  6. 华为阅读下载的文件在哪里找_华为手机还要天天清理内存?1键关闭这2个设置,手机用到2035年...
  7. 从芯片到 AI 生态,52 岁英特尔的蜕变!
  8. 神马?手机逆袭电脑了?PC版《我叫MT》下月在手机上封测?
  9. 笔记-Tukey Method发现outliers(离群点)
  10. jupyter怎么换背景颜色
  11. 不需要抓包分析、简单粗暴的模拟校园网登录方法——基于python playwright
  12. iis服务器跳转网页怎么设置,使用IIS管理器实现域名跳转
  13. excel中vlookup函数的使用方法_Excel教程:函数VLOOKUP实用技巧
  14. ucos 入门 --- 资料收集
  15. 人工智能-深度学习-yolov3口罩佩戴识别
  16. uiview 渐变_UIView的背景渐变
  17. 势哨乜池略撑滋度墓泵乜琴剐砂倒
  18. 第一章踏上python之旅_神界之唯我逍遥
  19. 各个排序算法的时间复杂度、稳定性、快排的原理以及图解
  20. 邓号用计算机怎么输入,电脑上顿号怎么打出来

热门文章

  1. 95后北大博士,任教北京高校走红网络,本人回应质疑!
  2. GoldenDict万能词典
  3. 《计算机网络》课程学习(14)——计算机网络与通信实验指导书
  4. AIX hang 0c20 IN GPFS system
  5. 360显示服务器内存,为什么我的电脑每次开机360显示内存占用了70以上,而且电脑蛮卡? 爱问知识人...
  6. 开源人才缺口持续扩大,Linux基金会揭秘开源就业真相
  7. 审批系统服务器巡检,创新搭建窗口巡查系统 着力打造智慧政务大厅
  8. Linux终端的用户体验增强方案
  9. 浙江工商大学计算机控制系统试卷,浙江工商大学信息学院845计算机基础综合历年考研真题汇编11p.doc...
  10. yii2高级模板开源商城系统实例、示例、DEMO,yii2框架学习开发必备