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

这篇具有很好参考价值的文章主要介绍了[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 /

[C#] 如何调用Python脚本程序,C#,python,c#,python,开发语言

缺点:

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

[C#] 如何调用Python脚本程序,C#,python,c#,python,开发语言

IronPython使用案例

NuGet安装IronPython

[C#] 如何调用Python脚本程序,C#,python,c#,python,开发语言

test.py

def sayHi():
    print("hello you")
    
def add(x,y):
    try:
        print(f"add {x}, {y}")
        return x + y
    except Exception as err:
        return str(err)
        
def sum(arr):
    try:
        print(f"sum {arr}")
        sum = 0
        for i in arr:
            sum += i
        return sum
    except 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);
        }
    }
}

运行效果

[C#] 如何调用Python脚本程序,C#,python,c#,python,开发语言

方式二: 通过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,c#,python,开发语言文章来源地址https://www.toymoban.com/news/detail-825895.html

到了这里,关于[C#] 如何调用Python脚本程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于旭日派的Ros系统小车的再开发——使用python脚本调用MIPI相机(学习笔记)

        这里我们导入了 cv2 、 time 、 ipywidgets 和 Mipi_Camera 这几个库。其中, cv2 是用于图像处理和计算机视觉的库; time 是用于计时和休眠的库; ipywidgets 是用于创建交互式窗口小部件的库; Mipi_Camera 则是用于控制和采集MIPI接口相机图像的库。当然除此之外,我们在代码中还添

    2024年01月21日
    浏览(46)
  • 如何通过python写接口自动化脚本对一个需要调用第三方支付的报名流程进行测试?

    对于需要调用第三方支付的报名流程进行接口自动化测试,可以通过以下步骤来编写Python代码: 1. 确认API需求 首先,需要确认报名流程的API需求和预期功能。这涉及到对业务需求的理解和API设计的分析。 2. 安装依赖库 在Python程序中,需要安装requests库(用于发送HTTP请求)和

    2024年02月10日
    浏览(68)
  • C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) 今天来接着学习OpenCV,现在主要是以Python代码为主了,所以先实现Python,在用C++/Csharp重现一遍。 边界填充就是向外填充图片信息,将图片扩大。填充分为上下

    2024年01月23日
    浏览(62)
  • IIS perl python cbrother php脚本语言配置及简单测试样例程序

    上篇笔记写了 IIS 配置 CGI, IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 这篇在IIS上配置一些脚本语言。为了操作方便,每种语言在站点下分设文件夹。 1. IIS perl配置 Perl CGI方式是曾经流行的做法。先下载一个开源的 Perl.exe 解释器,在免费的 sambar 服务器

    2024年02月09日
    浏览(43)
  • 在java中调用python脚本

    推荐使用第三种方法,因为只有第三种方法使用 Runtime.getRuntime() 才能执行含有第三方库(numpy,matlab,pandas等库)的python脚本。 1.首先在maven中添加依赖 2.使用Jpython中的PythonInterpreter执行Python语句 1.首先在maven中添加依赖(也是依赖Jpython包) 2.创建一个Python脚本 3.在java中执行p

    2024年02月15日
    浏览(34)
  • 【python VS vba】(3) 在python直接调用vba脚本

    目录 0 前言 1 VBA 内容 1.1  EXCEL这边VBA的内容 1.2 VBA的测试代码 2 python 调用 2.1 python 调用VBA的过程和结果 2.2 代码 前面写了这么多,没想到,其实py是可以直接支持VBA的 python的模块import xlwings,可以让python直接调用EXCEL工作簿文件里的VBA脚本 具体步骤如下 试验环境:C:UsersAd

    2024年02月06日
    浏览(42)
  • C#使用IronPython调用Python脚本实例

    本文 详细讲解在C#中调用Python脚本的 实例 。 首先 本文假设您已经安装好了Python环境和对应的库。 目录 一、IronPython简述

    2024年02月10日
    浏览(41)
  • DevOps系列文章之 java调用python脚本

    在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 官网地址 首页 | (jython.org) Jython项目提供了Java中的Python实现, 为Python提供了在JVM上运行的好处,并可以访问用Java编写的类。 当前版本(Jyt

    2024年02月14日
    浏览(44)
  • python如何开发小程序,python怎么做软件开发

    大家好,小编来为大家解答以下问题,python如何开发小程序,python怎么做软件开发,今天让我们一起来看看吧! 随着互联网的迅速发展,新技术不断创新,万物互联的时代,企业对IT人员的需求不断增加,很多想要进入IT行业的小伙伴经常会抱怨,想入门,却不知道从哪下手

    2024年02月21日
    浏览(68)
  • Python大数据之PySpark(三)使用Python语言开发Spark程序代码

    Spark Standalone的PySpark的搭建----bin/pyspark --master spark://node1:7077 Spark StandaloneHA的搭建—Master的单点故障(node1,node2),zk的leader选举机制,1-2min还原 【scala版本的交互式界面】bin/spark-shell --master xxx 【python版本交互式界面】bin/pyspark --master xxx 【提交任务】bin/spark-submit --master xxxx 【学

    2024年01月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包