首页 > 编程语言 >【愚公系列】2023年05月 .NET CORE工具案例-C#调用Python的二种方式

【愚公系列】2023年05月 .NET CORE工具案例-C#调用Python的二种方式

时间:2023-05-23 23:06:21浏览次数:30  
标签:CORE string 05 C# python Python sArguments StartInfo ser

(文章目录)


前言

.NET调用Python的作用和意义是可以利用Python强大的数据处理和机器学习能力,结合.NET的优势进行开发,提高开发效率和应用性能。同时,Python也可以通过.NET进行调用,实现跨语言的开发和应用。

一、C#调用Python的三种方式

1.ironPython调用

1.1 ironPython的安装

IronPython 是一种基于 Python 的 .NET 实现,它允许 Python 代码在 .NET 平台上运行。它是由 Jim Hugunin 开发的,最初是作为一个开源项目发布的。

ironPython

在这里插入图片描述

1.2 相关代码

Program.cs

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

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

Console.ReadKey();

在这里插入图片描述

test.py

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

在这里插入图片描述

1.3 运行

在这里插入图片描述

2.进程调用

2.1 写文件

using System.Collections;
using System.Diagnostics;

Process p = new Process();
string path = "test.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 += " " + param;
}

p.StartInfo.FileName = @"C:\Users\Happy\AppData\Local\Programs\Python\Python311\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();
# -*- 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])

在这里插入图片描述

2.2 返回信息

//调用python核心代码
using System.Diagnostics;

string[] strArr = new string[2];//参数列表
string sArguments = @"test.py";//这里是python的文件名字
strArr[0] = "2";
strArr[1] = "3";
RunPythonScript(sArguments, "-u", strArr);

static void RunPythonScript(string sArgName, string args = "", params string[] teps)
{
    Process p = new Process();
    string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
    path =  sArgName;//(因为我没放debug下,所以直接写的绝对路径,替换掉上面的路径了)
    p.StartInfo.FileName = @"C:\Users\Happy\AppData\Local\Programs\Python\Python311\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
    string sArguments = path;
    foreach (string sigstr in teps)
    {
        sArguments += " " + sigstr;//传递参数
    }

    sArguments += " " + args;

    p.StartInfo.Arguments = sArguments;

    p.StartInfo.UseShellExecute = false;

    p.StartInfo.RedirectStandardOutput = true;

    p.StartInfo.RedirectStandardInput = true;

    p.StartInfo.RedirectStandardError = true;

    p.StartInfo.CreateNoWindow = true;

    p.Start();
    p.BeginOutputReadLine();
    p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    Console.ReadLine();
    p.WaitForExit();
}
//输出打印的信息
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (!string.IsNullOrEmpty(e.Data))
    {
        AppendText(e.Data + Environment.NewLine);
    }
}

static void AppendText(string text)
{
    Console.WriteLine(text);     //此处在控制台输出.py文件print的结果

}

delegate void AppendTextCallback(string text);
def func():
    return 3
  
if __name__ == '__main__':
    print(func())

在这里插入图片描述

标签:CORE,string,05,C#,python,Python,sArguments,StartInfo,ser
From: https://blog.51cto.com/u_15437432/6334748

相关文章

  • K8S-学习笔记-001-容器Docker和K8S
    K8S-学习笔记-001-容器Docker和K8S容器是什么?简单来说,它就是个小工具,可以把你想跑的程序,库文件,配置文件都一起“打包”。在任何一个计算机的节点上,都可以使用这个打好的包。有了容器,一个命令就能把你想跑的程序跑起来,做到了一次打包,就可以到处使用。比如:可以把整套Zabbix环境(httpd......
  • 解决使用输入法输入在 React input 框中的问题
    问题在使用React绑定input输入框的onChange方法时,如果使用中文输入法(或者其他输入法),会出现一个问题:还在输入拼音的时候,onChange方法已经触发了,如下,即输入过程就已经触发了多次onChange方法。如果onChange方法有较为复杂的逻辑,就可能会带来一些用户体验或者逻辑的问题。......
  • C语言函数大全-- x 开头的函数(3)
    C语言函数大全本篇介绍C语言函数大全--x开头的函数1.xdr_opaque1.1函数说明函数声明函数功能bool_txdr_opaque(XDR*xdrs,char*buf,u_intlen);用于编码或解码任意长度的二进制数据参数:xdrs:指向XDR数据结构的指针,表示要进行编码或解码的数据流b......
  • 入门指南:学习C++编程的关键步骤
    C++是一种功能强大的编程语言,广泛应用于软件开发和系统编程。如果您想学习C++编程,下面是一些关键的步骤,可以帮助您入门。安装C++编译器要开始学习C++,您需要安装一个C++编译器。常用的C++编译器有GCC、Clang和MicrosoftVisualC++等。您可以根据自己的操作系统选择适合的编译器,并......
  • webpack-了解devServer中常用的选项
    devServer节点在webpack.config.js配置文件中,可以通过devServer节点对webpack-dev-server插件进行更多的配置,示例代码如下:devServer:{ open:ture,//初次打包完成后,自动打开浏览器 host:'127.0.0.1',//实时打包所使用的主机地址 port:80,//实时打包所使用的端口号}注意:凡是......
  • [hc32f460填坑] SystemCoreClock在进入main后变为0
    我的芯片型号是hc32f460jeua,使用的库为HC32F460_DDL_Rev3.1.0,keil包为HDSC.HC32F460.1.0.10。发现的问题:执行完SystemInit后SystemCoreClock为200000000,一进入mian函数就变为零。原因:__NO_INIT未起作用,__main对SystemCoreClock进行了初始化解决方法:1.把这两个勾上2,将Zero......
  • [ABC143E] Travel by Car
    TravelbyCar的传送门\(n\le300\)可凭感觉进行一遍Floyd。然后选两个点\(i,j\),如果\(i,j\)间的距离小于等于\(l\),则将\(i,j\)连一条代价为\(1\)的边(假设\(i,j\)要用一桶油)。最后再来一遍Floyd即可。因为第一次是加满油的,所以答案要\(-1\)。#include<bit......
  • IDEA配置jdk(或者IDEA代码报错The SDK is not specified for module)
    参考:https://blog.csdn.net/mask_boys/article/details/117385087今天敲代码时,出现一个错误,那就是TheSDKisnotspecifiedfor module,意思是没有为模块添加SDK,所以会出现如下错误 如何解决这个问题呢:首先:file-》projectStructure 然后 点击下划选项,然后就可以添加......
  • centos安装wget命令遇到的问题
    起初我只是想使用如下命令却出现这样的提示yum-yinstallntp解决办法yum-yinstallyum-utils但是问题是使用上面命令也实现同样提示使用下面的命令后再使用yum-yinstallyum-utilscurl-o/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Cent......
  • C语言编程—判断语句
    判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。C语言把任何非零和非空的值假定为true,把零或null假定为false。下面是大多数编程语言中典型的判断结构的一般形式:判断语句C语言提供了以下类型的判断语......