c#调用python主要有三种方法,但是实际上坑多的一匹。
1. ## ironpython
这个东西用.net做了一个pyhon解释器,理论上来说这个东西可以做到和c/c++调用pyhton一样。
实际上东西我没咋研究,因为只支持py2。。。。坑的一匹
顺带一提,这个东西是一个非微软维护的开源项目,用起来没有巨硬的支持的。
2. ## 使用命令行间接调用
这是网上实际使用较多的一种方法,但实际用起来我发现还是有问题。以我下列代码举例。
string output;
System.Diagnostics.Process p;
p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序
p.StandardInput.WriteLine("python \"D:/图片/桌面/每日任务式桌面/schedule/Python Function/DesktopIMG.py\"");
p.StandardInput.WriteLine("exit");
output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
System.Console.Write(output);
在如果脚本不能在数秒之内执行完毕的话WaitForExit()就会直接退出程序,而不会等待程序执行完毕,如果直接删去WaitForExit(),虽然不会闪退,但从output的数据来看,还是执行了几秒就停了,原因还在更深的层次。不管是在winform中还是console中实验结果都是一样的,排除了windows消息循环的锅。
然后。。。这个办法就不了了之了。
3. ## 输出bat并执行来间接间接调用
这个办法很low,low爆了,而且本质上还是调用命令行,所以仍然算作第二种的子类,但是起码可以执行。。。具体怎么做就不贴代码了,程序输出一个包含shell命令的bat文件并调用应该难不倒各位看官。
4. ## 通过其他语言来调用python
这办法一听就知道没有效率且很麻烦,不过如果要像IronPython一样调用python3,似乎只有这种办法了。通过python与C的DLL的交互然后再与c#交互。注意的要点有
- C#要允许不安全的代码才能使用c中的指针字符串。
- 如果写的c++是非托管模式,从功能上来说,只支持函数调用,但是如果托管的话速度就会变慢数倍,参见https://blog.csdn.net/m0_37251750/article/details/81280016
版权声明:本文为tanarctan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。