C#使用IronPython库调用Python脚本

 更新时间:2022年06月13日 09:33:22   作者:springsnow  
这篇文章介绍了C#使用IronPython库调用Python脚本的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎。

IronPython的主页: IronPython.net /

github站点:

IronLanguages/ironpython3: Implementation of Python 3.x for .NET Framework that is built on top of the Dynamic Language Runtime. (github.com)

IronLanguages/ironpython2: Implementation of the Python programming language for .NET Framework; built on top of the Dynamic Language Runtime (DLR). (github.com)

方式一:适用于python脚本中不包含第三方模块的情况

1、执行语句

借由IronPython,就可以利用.NET执行存储在Python脚本中的代码段。下面通过简单的示例说明如何应用C#调用Python脚本。

1、在VS中新建窗体项目:IronPythonDemo

2、VS的菜单中打开“Nuget程序包管理器”

3、搜索IronPython程序包并安装

安装后自动引用如下的DLL

4、在exe程序所在文件夹下创建Python脚本。Python示例脚本实现求两个数的四则运算:

num1=arg1
num2=arg2
op=arg3
if op==1:
    result=num1+num2
elif op==2:
    result=num1-num2
elif op==3:
    result=num1*num2
else:
    result=num1*1.0/num2

设置IronPythonDemo.py文件属性为“复制到输出目录”

5、修改工程的配置文件App.config如下:

其中microsoft.scripting节点中设置了IronPython语言引擎的几个属性。

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <configSections>  
    <section name="microsoft.scripting" type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting"/>  
  </configSections>  
  <microsoft.scripting>  
    <languages>  
      <language names="IronPython;Python;py" extensions=".py" displayName="Python" type="IronPython.Runtime.PythonContext, IronPython"/>  
    </languages>  
  </microsoft.scripting>  
    <startup>   
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
    </startup>  
</configuration>

6、 绘制窗体如下:

7、编写计算的函数:

ScriptRuntime scriptRuntime = ScriptRuntime.CreateFromConfiguration();
ScriptEngine pyEngine = scriptRuntime.GetEngine("python");
ScriptSource source = pyEngine.CreateScriptSourceFromFile("IronPythonDemo.py");//设置脚本文件
ScriptScope scope = pyEngine.CreateScope();

try
{
    //设置参数
    scope.SetVariable("arg1", Convert.ToInt32(txtNum1.Text));
    scope.SetVariable("arg2", Convert.ToInt32(txtNum2.Text));
    scope.SetVariable("arg3", operation.SelectedIndex + 1);
}
catch (Exception)
{
    MessageBox.Show("输入有误。");
}

source.Execute(scope);
labelResult.Text = scope.GetVariable("result").ToString();
}

8、编译运行可得计算结果(此处未做输入的检查)

2、执行函数

IronPythonDemo2.py

def main(arr):
  try:
    arr = set(arr)
    arr = sorted(arr)
    arr = arr[0:]
    return str(arr)
  except Exception as err:
    return str(err)

c#代码

ScriptEngine pyEngine = IronPython.Hosting.Python.CreateEngine();//创建Python解释器对象
dynamic py = pyEngine.ExecuteFile(@"IronPythonDemo2.py");//读取脚本文件
int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = py.main(array);//调用脚本文件中对应的函数
MessageBox.Show(reStr);


//或者

ScriptRuntime pyRuntime = IronPython.Hosting.Python.CreateRuntime(); //创建一下运行环境
dynamic obj = pyRuntime.UseFile("IronPythonDemo2.py"); //调用一个Python文件
int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = obj.main(array);//调用脚本文件中对应的函数
MessageBox.Show(reStr);

方式二:适用于python脚本中包含第三方模块的情况

C#代码

using System;
using System.Collections;
using System.Diagnostics;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            string path = "reset_ipc.py";//待处理python文件的路径,本例中放在debug文件夹下
            string sArguments = path;
            ArrayList arrayList = new ArrayList();
            arrayList.Add("com4");
            arrayList.Add(57600);
            arrayList.Add("password");
            foreach (var param in arrayList)//添加参数
            {
                sArguments += " " + sigstr;
            }

            p.StartInfo.FileName = @"D:\Python2\python.exe"; //python2.7的安装路径
            p.StartInfo.Arguments = sArguments;//python命令的参数
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();//启动进程

            Console.WriteLine("执行完毕!");

            Console.ReadKey();
        }
    }
}

python脚本

# -*- coding: UTF-8 -*-
import serial
import time

def resetIPC(com, baudrate, password, timeout=0.5):
    ser=serial.Serial(com, baudrate, timeout=timeout)
    flag=True
    try:
        ser.close()
        ser.open()
        ser.write("\n".encode("utf-8"))
        time.sleep(1)
        ser.write("root\n".encode("utf-8"))
        time.sleep(1)
        passwordStr="%s\n" % password
        ser.write(passwordStr.encode("utf-8"))
        time.sleep(1)
        ser.write("killall -9 xxx\n".encode("utf-8"))
        time.sleep(1)
        ser.write("rm /etc/xxx/xxx_user.*\n".encode("utf-8"))
        time.sleep(1)
        ser.write("reboot\n".encode("utf-8"))
        time.sleep(1)
    except Exception:
        flag=False
    finally:
        ser.close()
    return flag

resetIPC(sys.argv[1], sys.argv[2], sys.argv[3])

上面的python脚本实现的是重启IPC设备,测试功能成功。

调用包含第三方模块的python脚本时,尝试过使用path.append()方式,调试有各种问题,最终放弃了,没有研究。

到此这篇关于C#使用IronPython库调用Python脚本的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • C#封装DBHelper类

    C#封装DBHelper类

    DBHelper类是用类将ADO.NET用方法封装起来,用以减少程序员的工作量。本文为大家提供一个C#封装的DBHelper类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • c# 使用handle.exe解决程序更新文件被占用的问题

    c# 使用handle.exe解决程序更新文件被占用的问题

    这篇文章主要介绍了c# 使用handle.exe解决程序更新文件被占用的问题,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • 详解C#枚举中使用Flags特性

    详解C#枚举中使用Flags特性

    这篇文章主要介绍了C#枚举中使用Flags特性的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • c#中禁用windows的任务管理器的方法

    c#中禁用windows的任务管理器的方法

    这篇文章主要介绍了c#中禁用windows的任务管理器的方法,通过注册表实现禁用,需要的朋友可以参考下
    2014-06-06
  • C# Redis学习系列(二)Redis基本设置

    C# Redis学习系列(二)Redis基本设置

    这篇文章主要为大家分享了C# Redis学习系列教程第二篇, Redis基本设置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • c# Parallel类的使用

    c# Parallel类的使用

    这篇文章主要介绍了c# Parallel类的使用,帮助大家实现数据与任务的并行,感兴趣的朋友可以了解下
    2020-11-11
  • C#使用Npoi导出Excel并合并行列

    C#使用Npoi导出Excel并合并行列

    这篇文章主要为大家详细介绍了C#使用Npoi导出Excel并合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • c# openxml 删除xlsx、xls的外链示例代码

    c# openxml 删除xlsx、xls的外链示例代码

    要删除一个 Excel 文件(.xlsx)中的外部链接(external links),你可以使用 OpenXML SDK,本文演示如何使用 OpenXML SDK 删除外部链接,感兴趣的朋友一起看看吧
    2024-01-01
  • Unity实现桌面反弹的示例代码

    Unity实现桌面反弹的示例代码

    反弹球是小时候都玩过的网页小游戏,但是很多人都不知道怎样实现,本文就来介绍一下Unity实现桌面反弹的示例代码,感兴趣的可以了解一下
    2021-05-05
  • 一文详解C#中重写(override)及覆盖(new)的区别

    一文详解C#中重写(override)及覆盖(new)的区别

    这篇文章主要为大家详细介绍了C#中重写(override)及覆盖(new)这两个关键词的区别,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论