当前位置:   article > 正文

[C#] 如何调用Python脚本程序_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 /

缺点:

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

IronPython使用案例

NuGet安装IronPython

test.py

  1. def sayHi():
  2. print("hello you")
  3. def add(x,y):
  4. try:
  5. print(f"add {x}, {y}")
  6. return x + y
  7. except Exception as err:
  8. return str(err)
  9. def sum(arr):
  10. try:
  11. print(f"sum {arr}")
  12. sum = 0
  13. for i in arr:
  14. sum += i
  15. return sum
  16. except Exception as err:
  17. return str(err)

PythonScriptWindow.axml

  1. <Window x:Class="CallPythonDemos.PythonScriptWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:CallPythonDemos"
  7. mc:Ignorable="d"
  8. Title="Python Script调用" Height="450" Width="800">
  9. <Grid>
  10. <Grid.RowDefinitions>
  11. <RowDefinition Height="auto"/>
  12. <RowDefinition Height="auto"/>
  13. <RowDefinition/>
  14. </Grid.RowDefinitions>
  15. <Grid.ColumnDefinitions>
  16. <ColumnDefinition/>
  17. <ColumnDefinition/>
  18. </Grid.ColumnDefinitions>
  19. <Button x:Name="btnCallPythonScript" Content="调用python脚本" Grid.Row="0" Margin="5" Click="btnCallPythonScript_Click"/>
  20. <Button x:Name="btnClearOutput" Content="清理输出" Grid.Row="0" Grid.Column="1" Margin="5" Click="btnClearOutput_Click"/>
  21. <TextBlock Text="输入参数:" Grid.Row="1" Margin="5"/>
  22. <TextBlock Text="输出结果:" Grid.Row="1" Grid.Column="1" Margin="5"/>
  23. <TextBox x:Name="txtInputParam" Grid.Row="2" Margin="5"/>
  24. <RichTextBox x:Name="txtOutputResult" Grid.Row="2" Grid.Column="1" Margin="5" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" IsReadOnly="True">
  25. <RichTextBox.Document>
  26. <FlowDocument/>
  27. </RichTextBox.Document>
  28. </RichTextBox>
  29. </Grid>
  30. </Window>

PythonScriptWindow.axml.cs

  1. using IronPython.Hosting;
  2. using Microsoft.Scripting.Hosting;
  3. using System.Diagnostics;
  4. using System.Windows;
  5. using System.Windows.Documents;
  6. using System.Windows.Media;
  7. namespace CallPythonDemos
  8. {
  9. /// <summary>
  10. /// PythonScriptWindow.xaml 的交互逻辑
  11. /// </summary>
  12. public partial class PythonScriptWindow : Window
  13. {
  14. public PythonScriptWindow()
  15. {
  16. InitializeComponent();
  17. }
  18. private void btnCallPythonScript_Click(object sender, RoutedEventArgs e)
  19. {
  20. _RunTestByIronPython();
  21. }
  22. private void btnClearOutput_Click(object sender, RoutedEventArgs e)
  23. {
  24. txtOutputResult.Document.Blocks.Clear();
  25. }
  26. private void _RunTestByIronPython()
  27. {
  28. ScriptEngine pyEngine = Python.CreateEngine();
  29. dynamic testpy = pyEngine.ExecuteFile("test.py");
  30. testpy.sayHi();
  31. var add = testpy.add(3, 5);
  32. _WriteLog($"add 方法的和是:{add}");
  33. int[] arr = new int[3] { 2, 4, 6 };
  34. var sum = testpy.sum(arr);
  35. _WriteLog($"数组的和是:{sum}");
  36. }
  37. private void _WriteLog(string? log)
  38. {
  39. Paragraph para = new Paragraph() { Margin = new Thickness(0) };
  40. para.Inlines.Add(new Run(log) { Foreground = Brushes.Black });
  41. txtOutputResult.Document.Blocks.Add(para);
  42. }
  43. }
  44. }

运行效果

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

优缺点

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

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

安装scikit-learn

pip install scikit-learn

gen_model.py

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

PythonScriptWindow.axml.cs

  1. using IronPython.Hosting;
  2. using Microsoft.Scripting.Hosting;
  3. using System.Diagnostics;
  4. using System.Windows;
  5. using System.Windows.Documents;
  6. using System.Windows.Media;
  7. namespace CallPythonDemos
  8. {
  9. /// <summary>
  10. /// PythonScriptWindow.xaml 的交互逻辑
  11. /// </summary>
  12. public partial class PythonScriptWindow : Window
  13. {
  14. public PythonScriptWindow()
  15. {
  16. InitializeComponent();
  17. }
  18. private void btnCallPythonScript_Click(object sender, RoutedEventArgs e)
  19. {
  20. //_RunTestByIronPython();
  21. _RunPythonScript();
  22. }
  23. private void btnClearOutput_Click(object sender, RoutedEventArgs e)
  24. {
  25. txtOutputResult.Document.Blocks.Clear();
  26. }
  27. private void _RunTestByIronPython()
  28. {
  29. ScriptEngine pyEngine = Python.CreateEngine();
  30. dynamic testpy = pyEngine.ExecuteFile("test.py");
  31. testpy.sayHi();
  32. var add = testpy.add(3, 5);
  33. _WriteLog($"add 方法的和是:{add}");
  34. int[] arr = new int[3] { 2, 4, 6 };
  35. var sum = testpy.sum(arr);
  36. _WriteLog($"数组的和是:{sum}");
  37. }
  38. /// <summary>
  39. /// 调用python脚本
  40. /// </summary>
  41. private void _RunPythonScript()
  42. {
  43. Process p = new Process();
  44. p.StartInfo.FileName = "D:/my_project/Anaconda3/envs/jupyterlab_py310/python.exe";
  45. p.StartInfo.Arguments = "D:/my_project/first_board_debug/gen_model.py";
  46. p.StartInfo.UseShellExecute = false;
  47. p.StartInfo.RedirectStandardOutput = true;
  48. p.StartInfo.RedirectStandardInput = true;
  49. p.StartInfo.RedirectStandardError = true;
  50. p.StartInfo.CreateNoWindow = true;
  51. _WriteLog($"执行python脚本开始------------");
  52. p.Start();
  53. /*string output = p.StandardOutput.ReadToEnd(); //读取控制台的输出信息
  54. p.WaitForExit(); // 等待外部程序进行完毕
  55. _WriteLog(output);
  56. _WriteLog($"执行python脚本结束------------ exit code: {p.ExitCode}");*/
  57. // 如果使用异步读取输出流,python程序不会自动退出,调用WaitForExit会阻塞,
  58. // 必须自己根据返回来的字符串来决定程序是否已经执行完成
  59. p.BeginOutputReadLine();
  60. p.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);
  61. }
  62. /// <summary>
  63. /// 输出执行python脚本的控制台信息
  64. /// </summary>
  65. private void outputDataReceived(object sender, DataReceivedEventArgs e)
  66. {
  67. if (!string.IsNullOrEmpty(e.Data))
  68. {
  69. _WriteLog(e.Data);
  70. if (e.Data == "done")
  71. {
  72. var p = sender as Process;
  73. if(p!=null)
  74. {
  75. _WriteLog($"执行python脚本结束");
  76. p.Close();
  77. }
  78. }
  79. }
  80. }
  81. private void _WriteLog(string? log)
  82. {
  83. this.Dispatcher.Invoke(() => {
  84. Paragraph para = new Paragraph() { Margin = new Thickness(0) };
  85. para.Inlines.Add(new Run(log) { Foreground = Brushes.Black });
  86. txtOutputResult.Document.Blocks.Add(para);
  87. });
  88. }
  89. }
  90. }

运行效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/478450
推荐阅读
相关标签
  

闽ICP备14008679号