笔者实训需要完成一个AI项目,用到了C#窗体调用python脚本的知识。于是上网百度了一下,发现有使用IronPython来实现该功能的博客,但是遇到了很多问题:比如引用的模块版本不一致、Microsoft.Scripting.SyntaxErrorException: 'unexpected token ‘from’'等问题。因此采用了该博主的方法,成功实现了该功能。
可以有几种方式, 本文示例为直接调用代码方式。
VS2017新建一个WPF工程,加一个button:
MainWindow.xaml.cs 代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace AddressRecognizeDemo
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string[] strArr = new string[2];
string sArguments = @"testing.py"; //调用的python的文件名字
strArr[0] = "2";
strArr[1] = "3";
RunPythonScript(sArguments, "-u", strArr);
}
public static void RunPythonScript(string sArgName, string args = "", params string[] teps)
{
Process p = new Process();
//string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
string path = @"F:\object_detection\" + sArgName;
p.StartInfo.FileName = @"C:\Users\ty\AppData\Local\Programs\Python\Python35\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
string sArguments = path;
foreach (string sigstr in teps)
{
sArguments += " " + sigstr;//传递参数
}
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的结果
}
}
}
调用的main.py程序如下:
#C#代码调用的Python示例程序
#使用:将main.py 放置于任何目录下,MainWindow.xaml.cs文件里修改相应地址即可调用。 string #path = @"F:\object_detection\"
#输入:整数a,b
#输出:返回a*b开根号计算结果
import numpy as np
import sys
def func(a,b):
result=np.sqrt(int(a) * int(b))
return result
if __name__ == '__main__':
print(func(sys.argv[1],sys.argv[2]))