当前位置: 首页 > news >正文

[C#] 如何调用Python脚本程序

为什么需要C#调用python?

有以下几个原因需要C#调用Python:

  1. Python拥有丰富的生态系统:Python有很多强大的第三方库和工具,可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python,可以利用Python的生态系统来完成一些特定的任务。

  2. C#和Python的优势互补:C#是一种高性能、静态类型的编程语言,适合用于开发大型应用程序和高性能的系统。而Python则是一种动态类型的脚本语言,适合用于快速开发原型和处理复杂的数据分析任务。通过C#调用Python,可以充分发挥两者的优势。

  3. C#和Python在不同领域的应用:C#主要应用于Windows平台的开发,而Python则可以用于各种平台,包括Windows、Linux和Mac OS。通过C#调用Python,可以在C#应用程序中使用Python的功能和特性,实现更广泛的应用场景。

如何实现C#调用python脚本程序?

方式一:通过C#IronPython开源库

IronPython是一个基于.NET平台的Python解释器。它是使用C#编写的,可以被集成到.NET应用程序中,并且可以直接调用和使用.NET库和组件。IronPython提供了一个Python语言的实现,同时具备了与.NET平台无缝集成的能力。

IronPython最初由微软开发并发布,旨在提供一个Python解释器,使Python开发人员能够利用.NET框架的优势。IronPython是完全兼容Python 2.7语法和语义的,并且还支持一些Python 3的一些特性。IronPython可以通过.NET编译器将Python代码转换为托管代码,并与.NET框架进行交互。

IronPython具有以下特点和优势:

  • 与.NET框架的深度集成:IronPython可以直接与.NET库和组件进行交互,可以轻松使用和调用.NET的功能和类库。
  • 动态语言的灵活性:作为一种动态类型的脚本语言,IronPython具有动态性和灵活性,可以进行快速的原型开发和动态脚本编写。
  • 跨平台支持:IronPython可以在Windows、Linux和Mac OS等多个平台上运行,并且可以与不同平台的.NET应用程序集成。
  • 社区支持和活跃度:IronPython拥有活跃的开源社区,有大量的开发者和用户为其贡献代码和提供支持。

总之,IronPython是一个具有.NET集成和跨平台支持的Python解释器,可以在.NET平台开发中使用Python语言和功能。

IronPython.net /

缺点:

1)只支持到python 3.4的相关特性, 和目前主流的python 3.9, 3.10,3.11等版本相差甚远,会导致很多python流行的开源库(比如scikit-learn),无法正常使用。

IronPython使用案例

NuGet安装IronPython

test.py

def sayHi():print("hello you")def add(x,y):try:print(f"add {x}, {y}")return x + yexcept Exception as err:return str(err)def sum(arr):try:print(f"sum {arr}")sum = 0for i in arr:sum += ireturn sumexcept Exception as err:return str(err)

PythonScriptWindow.axml

<Window x:Class="CallPythonDemos.PythonScriptWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:CallPythonDemos"mc:Ignorable="d"Title="Python Script调用" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button x:Name="btnCallPythonScript" Content="调用python脚本" Grid.Row="0" Margin="5" Click="btnCallPythonScript_Click"/><Button x:Name="btnClearOutput" Content="清理输出" Grid.Row="0" Grid.Column="1" Margin="5" Click="btnClearOutput_Click"/><TextBlock Text="输入参数:" Grid.Row="1" Margin="5"/><TextBlock Text="输出结果:" Grid.Row="1" Grid.Column="1" Margin="5"/><TextBox x:Name="txtInputParam" Grid.Row="2" Margin="5"/><RichTextBox x:Name="txtOutputResult" Grid.Row="2" Grid.Column="1" Margin="5" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" IsReadOnly="True"><RichTextBox.Document><FlowDocument/></RichTextBox.Document></RichTextBox></Grid>
</Window>

PythonScriptWindow.axml.cs

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Diagnostics;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;namespace CallPythonDemos
{/// <summary>/// PythonScriptWindow.xaml 的交互逻辑/// </summary>public partial class PythonScriptWindow : Window{public PythonScriptWindow(){InitializeComponent();}private void btnCallPythonScript_Click(object sender, RoutedEventArgs e){_RunTestByIronPython();}private void btnClearOutput_Click(object sender, RoutedEventArgs e){txtOutputResult.Document.Blocks.Clear();}private void _RunTestByIronPython(){ScriptEngine pyEngine = Python.CreateEngine();dynamic testpy = pyEngine.ExecuteFile("test.py");testpy.sayHi();var add = testpy.add(3, 5);_WriteLog($"add 方法的和是:{add}");int[] arr = new int[3] { 2, 4, 6 };var sum = testpy.sum(arr);_WriteLog($"数组的和是:{sum}");}private void _WriteLog(string? log){Paragraph para = new Paragraph() { Margin = new Thickness(0) };para.Inlines.Add(new Run(log) { Foreground = Brushes.Black });txtOutputResult.Document.Blocks.Add(para);}}
}

运行效果

方式二: 通过Process类来运行python解释器

优缺点

优点:可以使用python当前的主流版本,并且可以使用大部分的流行的开源库。

缺点:只能通过命令行参数和控制台输出与python进行通信。

安装scikit-learn

pip install scikit-learn

gen_model.py

from sklearn import linear_model
if __name__ == '__main__':reg = linear_model.LinearRegression()reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])print('coef_:', reg.coef_)print('intercept_:', reg.intercept_)print('done')

PythonScriptWindow.axml.cs

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Diagnostics;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;namespace CallPythonDemos
{/// <summary>/// PythonScriptWindow.xaml 的交互逻辑/// </summary>public partial class PythonScriptWindow : Window{public PythonScriptWindow(){InitializeComponent();}private void btnCallPythonScript_Click(object sender, RoutedEventArgs e){//_RunTestByIronPython();_RunPythonScript();}private void btnClearOutput_Click(object sender, RoutedEventArgs e){txtOutputResult.Document.Blocks.Clear();}private void _RunTestByIronPython(){ScriptEngine pyEngine = Python.CreateEngine();dynamic testpy = pyEngine.ExecuteFile("test.py");testpy.sayHi();var add = testpy.add(3, 5);_WriteLog($"add 方法的和是:{add}");int[] arr = new int[3] { 2, 4, 6 };var sum = testpy.sum(arr);_WriteLog($"数组的和是:{sum}");}/// <summary>///  调用python脚本/// </summary>private void _RunPythonScript(){Process p = new Process();p.StartInfo.FileName = "D:/my_project/Anaconda3/envs/jupyterlab_py310/python.exe";p.StartInfo.Arguments = "D:/my_project/first_board_debug/gen_model.py";p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardError = true;p.StartInfo.CreateNoWindow = true;_WriteLog($"执行python脚本开始------------");p.Start();/*string output = p.StandardOutput.ReadToEnd(); //读取控制台的输出信息p.WaitForExit();  // 等待外部程序进行完毕_WriteLog(output);_WriteLog($"执行python脚本结束------------ exit code: {p.ExitCode}");*/// 如果使用异步读取输出流,python程序不会自动退出,调用WaitForExit会阻塞,// 必须自己根据返回来的字符串来决定程序是否已经执行完成p.BeginOutputReadLine();p.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);}/// <summary>/// 输出执行python脚本的控制台信息/// </summary>private void outputDataReceived(object sender, DataReceivedEventArgs e){if (!string.IsNullOrEmpty(e.Data)){_WriteLog(e.Data);if (e.Data == "done"){var p = sender as Process;if(p!=null){_WriteLog($"执行python脚本结束");p.Close();}}}}private void _WriteLog(string? log){this.Dispatcher.Invoke(() => {Paragraph para = new Paragraph() { Margin = new Thickness(0) };para.Inlines.Add(new Run(log) { Foreground = Brushes.Black });txtOutputResult.Document.Blocks.Add(para);});}}
}

运行效果

相关文章:

[C#] 如何调用Python脚本程序

为什么需要C#调用python&#xff1f; 有以下几个原因需要C#调用Python&#xff1a; Python拥有丰富的生态系统&#xff1a;Python有很多强大的第三方库和工具&#xff0c;可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python&#xff0c;可以利用Python的生态系…...

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步&#xff1a;测试最终效果第二步&#xff1a;使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步&#xff1a;Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步&#xff1a;应用主题 前言 只不过是突发奇想&#xff0c…...

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…...

Linux之动静态库

今天我们来讲动静态库&#xff01; 首先我们来粗粒度的划分一下动态库和静态库。 动态库就是只有一份库文件&#xff0c;所有想用该库的文件与改库文件建立链接&#xff0c;然后使用。这样可以提高代码复用率&#xff0c;避免重复拷贝产生没必要的内存消耗。 静态库&#xf…...

手机常亮屏不自动灭屏

一. 基础知识介绍 1. WakeLock&#xff08;休眠锁&#xff09; WakeLock用于保持设备的唤醒状态&#xff0c;有些情况下&#xff0c;即时用户不操作App&#xff0c;我们也需要保持屏幕处于唤醒状态&#xff0c;以保证用户体验&#xff0c;比如视频类APP和计步类APP&#xff0c;…...

JVM(1)基础篇

1 初始JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。 使用…...

相机图像质量研究(12)常见问题总结:光学结构对成像的影响--炫光

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

[OPEN SQL] 删除数据

DELETE语句用于删除数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要删除以下数据 1.删除单条数据 语法格式 DELETE <dbtab> FROM <wa>. DELETE <dbtab> FROM TABLE <itab>. DELETE FROM &…...

C语言第二十五弹---字符函数和字符串函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、字符分类函数 2、字符转换函数 3、strlen的使用和模拟实现 4、strcpy 的模拟实现 5、strcat 的模拟实现 6、strcmp 的模拟实现 7、strncpy 函数的使用 总结…...

寒假学习记录16:Express框架(Node)

后续会补充 1.引入express 1.先下载express框架 创建一个package.json格式的文件&#xff0c;里面写入 {"dependencies": {"express": "~4.16.1" //express版本号} } 然后打开终端输入 npm i 2.引入express模块 const express require(&quo…...

机器学习中的10种非线性降维技术对比总结

降维意味着我们在不丢失太多信息的情况下减少数据集中的特征数量&#xff0c;降维算法属于无监督学习的范畴&#xff0c;用未标记的数据训练算法。 尽管降维方法种类繁多&#xff0c;但它们都可以归为两大类:线性和非线性。 线性方法将数据从高维空间线性投影到低维空间(因此…...

[ubuntu]split命令分割文件

split 命令 $ split --help Usage: split [OPTION]... [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is x. With no INPUT, or when INPUT is -, read standard input.Mandatory argume…...

《小强升职记:时间管理故事书》阅读笔记

目录 前言 一、你的时间都去哪儿了 1.1 你真的很忙吗 1.2 如何记录和分析时间日志 1.3 如何找到自己的价值观 二、无压工作法 2.1 传说中的“四象限法则 2.2 衣柜整理法 三、行动时遇到问题怎么办&#xff1f; 3.1 臣服与拖延 3.2 如何做到要事第一&#xff1f; 3.…...

visual studio code could not establish connection to *: XHR failed

vscode远程连接服务器时&#xff0c;输入密码&#xff0c;又重新提示输入密码&#xff0c;就这样循环了好几次&#xff0c;然后会报上述的错误。由于我是window系统&#xff0c;我用cmd&#xff0c;然后ssh */你的IP地址/*发现可以远程到服务器上&#xff0c;但是通过Vscode就不…...

JVM-面试题

一、对象 1、对象创建 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池定位到类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。若没有,必须先执行类加载过程。分配内存 类加载检查通过后,jvm将为新生对象分配内存,…...

计算机网络——多媒体网络

前些天发现了一个巨牛的人工智能学习网站 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; 跳转到网站 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络学习过程中的学习笔记与心得&#xff0c;在参考相关教材&#xff0c;网络搜素…...

GPIO八种工作模式

目录 一、推挽输出 二、开漏输出 三、复用推挽输出 四、复用开漏输出 五、浮空输入 六、上拉输入 七、下拉输入 八、模拟输入 GPIO八种配置模式&#xff0c;原理和使用场景&#xff0c;硬件原理如下图&#xff1a; 一、推挽输出 1、 原理 当控制栅极为低电平时&#x…...

C++初阶:适合新手的手撕list(模拟实现list)

上次讲了常用的接口&#xff1a;今天就来进行模拟实现啦 文章目录 1.基本结构与文件规划2.空参构造函数&#xff08;constructor)3.完善迭代器&#xff08;iterator&#xff09;(begin(),end())4.List Capacity&#xff08;size(),empty())4.增删改查(push_back,pop_back,pop_f…...

js手写Promise(上)

目录 构造函数resolve与reject状态改变状态改变后就无法再次改变 代码优化回调函数中抛出错误 thenonFulfilled和onRejected的调用时机异步then多个then 如果是不知道或者对Promise不熟悉的铁铁可以先看我这篇文章 Promise 构造函数 在最开始&#xff0c;我们先不去考虑Promi…...

基于Web技术的家居室内温湿度监测系统

设计一个基于Web技术的家居室内温湿度监测系统涉及前端和后端开发&#xff0c;以及与硬件传感器的集成。以下是一个简单的设计概述&#xff1a; ### 1. 系统架构 - **前端**: 用户界面&#xff0c;用于显示实时数据和历史记录&#xff0c;可通过Web浏览器访问。 - **后端**: 服…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...