c#调用python的三种方法
2021/4/25 22:27:11
本文主要是介绍c#调用python的三种方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://blog.csdn.net/qq_42063091/article/details/82418630
一、使用c#,nuget管理包上下载的ironPython安装包
尝试后发现,对引用了numpy等第三方库的python代码,会报找不到模块xxx的错误,上网查证后发现此问题基本难以解决
二、使用安装好的python环境,利用c#命令行,调用.py文件执行
优点:执行速度只比在python本身环境中慢一点,步骤也相对简单
缺点:需要用户安装配置python环境
实用步骤:
1、下载安装python,并配置好环境变量等(本人用的Anaconda)
2、编写python文件(这里为了便于理解,只传比较简单的两个参数)
注:这两个python文件,我引用了numpy第三方库,也要安装后才能在python中使用
#multi.py def multiplication(a,b): return a*b
#main.py import numpy as np import multi import sys def func(a,b): result=np.sqrt(multi.multiplication(int(a),int(b))) return result if __name__ == '__main__': print(func(sys.argv[1],sys.argv[2]))
ps:为了import不报错,尽量把multi.py文件放main.py同一文件夹下。因为打包exe文件执行后,可能会报找不到Multi模块的错误
3、在c#中调用上述主python文件:main.py
(我直接建了一个wpf文件,放在一个按钮的点击事件中执行了)
private void Button_Click(object sender, RoutedEventArgs e) { string[] strArr=new string[2];//参数列表 string sArguments = @"main.py";//这里是python的文件名字 strArr[0] = "2"; strArr[1] = "3"; RunPythonScript(sArguments, "-u", strArr); } //调用python核心代码 public 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 = @"C:\Users\user\Desktop\test\"+sArgName;//(因为我没放debug下,所以直接写的绝对路径,替换掉上面的路径了) p.StartInfo.FileName = @"D:\Python\envs\python3\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); } } public delegate void AppendTextCallback(string text); public static void AppendText(string text) { Console.WriteLine(text); //此处在控制台输出.py文件print的结果 }
执行成功,得到结果:也就是
三、c# 调用python可执行exe文件,使用命令行进行传参取返回值
优点:无需安装python运行环境
缺点:
- 可能是因为要展开exe中包含的python环境,执行速度相当慢,慎用!
- 因为是命令行传参形式,故传参需要自行处理。ps:由于命令行传参形式为:xxx.exe 参数1 参数2 参数3…
我要传一个很大的数组,曲线救国,用c#将数组写入txt文件中,将存放路径传给python函数,python读取此txt文件得到数据
使用步骤:
1、编写python文件(这里为了便于理解,只传比较简单的两个参数)
#multi.py def multiplication(a,b): return a*b
#main.py import numpy as np import multi import sys def func(a,b): result=np.sqrt(multi.multiplication(int(a),int(b))) return result if __name__ == '__main__': print(func(sys.argv[1],sys.argv[2]))
ps:为了import不报错,尽量把multi.py文件放main.py同一文件夹下。因为打包exe文件执行后,可能会报找不到Multi模块的错误
2、安装pyInstaller(若已安装请直接跳过此步骤)
我使用的是Anaconda编写python,所以使用Anaconda Prompt进行安装pyInstaller(直接安装python并配好环境变量的小伙伴,可以在电脑的cmd下进行操作)
这个类似于电脑的cmd.exe程序,可在其中输入命令行操作
安装pyInstaller命令行:
正常来讲会报一个错误,说你的pip版本过低,需要先更新一下
pip install --upgrade pip
使用此命令更新pip,然后再执行pip install pyinstaller命令即可
3、使用pyinstaller打包python程序
同样还是在Anaconda Prompt中,cd python文件所在的路径,然后执行打包命令
打包过程可能会出错(找不到模块、迭代深度超出等,在我另两篇博客里有解决办法)
若打包成功,出现successfully,失败的话会给出错误信息
4、在c#中调用此exe文件(此处我建了一个wpf项目,利用按钮点击事件来实现调用)
namespace WpfTest2 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { //string debugPath = System.Environment.CurrentDirectory; //此c#项目的debug文件夹路径 string pyexePath = @"C:\Users\user\Desktop\test\dist\main.exe"; //python文件所在路径,一般不使用绝对路径,此处仅作为例子,建议转移到debug文件夹下 Process p = new Process(); p.StartInfo.FileName = pyexePath;//需要执行的文件路径 p.StartInfo.UseShellExecute = false; //必需 p.StartInfo.RedirectStandardOutput = true;//输出参数设定 p.StartInfo.RedirectStandardInput = true;//传入参数设定 p.StartInfo.CreateNoWindow = true; p.StartInfo.Arguments = "2 3";//参数以空格分隔,如果某个参数为空,可以传入”” p.Start(); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();//关键,等待外部程序退出后才能往下执行} Console.Write(output);//输出 p.Close(); } } }
这篇关于c#调用python的三种方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统