从Winform C#应用程序调用Python脚本
我想从我的winform C应用程序调用Python脚本。我检查了一些解决方案,并遵循以下方法。一个使用进程间通信,另一个使用IronPython从Winform C#应用程序调用Python脚本,c#,python-3.x,winforms,process,ironpython,C#,Python 3.x,Winforms,Process,Ironpython,我想从我的winform C应用程序调用Python脚本。我检查了一些解决方案,并遵循以下方法。一个使用进程间通信,另一个使用IronPython private void BtnJsonPy_Click(object sender, EventArgs e) { // 1. Create Engine var engine = Python.CreateEngine(); //2. Provide script and argument
private void BtnJsonPy_Click(object sender, EventArgs e)
{
// 1. Create Engine
var engine = Python.CreateEngine();
//2. Provide script and arguments
var script = @"C:\Users\simeh\source\HDFC\repos\SamplePy\SamplePy2\SamplePy2.py"; // provide full path
var source = engine.CreateScriptSourceFromFile(script);
// dummy parameters to send Python script
int x = 3;
int y = 4;
var argv = new List<string>();
argv.Add("");
argv.Add(x.ToString());
argv.Add(y.ToString());
engine.GetSysModule().SetVariable("argv", argv);
//3. redirect output
var eIO = engine.Runtime.IO;
var errors = new MemoryStream();
eIO.SetErrorOutput(errors, Encoding.Default);
var results = new MemoryStream();
eIO.SetOutput(results, Encoding.Default);
//4. Execute script
var scope = engine.CreateScope();
var lib = new[]
{
"C:\\path\\SamplePy\\packages\\IronPython.2.7.9\\lib",
"C:\\path\\SamplePy\\packages\\IronPython.2.7.9",
};
engine.SetSearchPaths(lib);
engine.ExecuteFile(script, scope);
//source.Execute(scope);
//5. Display output
string str(byte[] x1) => Encoding.Default.GetString(x1);
Console.WriteLine("Errrors");
Console.WriteLine(str(errors.ToArray()));
Console.WriteLine();
Console.WriteLine("Results");
Console.WriteLine(str(results.ToArray()));
}
方法1:使用进程间通信
private void BtnSumPy_Click(object sender, EventArgs e)
{
string python = @"C:\Programs\Python\Python37-32\python.exe";
// python app to call
string myPythonApp = @"C:\mypath\\SamplePy\SamplePy2\SamplePy2.py";
// dummy parameters to send Python script
int x = 3;
int y = 4;
// Create new process start info
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(python);
// make sure we can read the output from stdout
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardOutput = true;
// start python app with 3 arguments
// 1st arguments is pointer to itself,
// 2nd and 3rd are actual arguments we want to send
myProcessStartInfo.Arguments = myPythonApp + " " + x + " " + y;
Process myProcess = new Process();
// assign start information to the process
myProcess.StartInfo = myProcessStartInfo;
// start the process
myProcess.Start();
// Read the standard output of the app we called.
// in order to avoid deadlock we will read output first
// and then wait for process terminate:
StreamReader myStreamReader = myProcess.StandardOutput;
string myString = myStreamReader.ReadLine();
/*if you need to read multiple lines, you might use:
string myString = myStreamReader.ReadToEnd() */
// wait exit signal from the app we called and then close it.
myProcess.WaitForExit();
myProcess.Close();
lblAns.Text = myString;
}
上述方法的问题是Python.exe也必须安装在本地机器上,因为winform app将在系统上本地运行
方法2:使用IronPython
private void BtnJsonPy_Click(object sender, EventArgs e)
{
// 1. Create Engine
var engine = Python.CreateEngine();
//2. Provide script and arguments
var script = @"C:\Users\simeh\source\HDFC\repos\SamplePy\SamplePy2\SamplePy2.py"; // provide full path
var source = engine.CreateScriptSourceFromFile(script);
// dummy parameters to send Python script
int x = 3;
int y = 4;
var argv = new List<string>();
argv.Add("");
argv.Add(x.ToString());
argv.Add(y.ToString());
engine.GetSysModule().SetVariable("argv", argv);
//3. redirect output
var eIO = engine.Runtime.IO;
var errors = new MemoryStream();
eIO.SetErrorOutput(errors, Encoding.Default);
var results = new MemoryStream();
eIO.SetOutput(results, Encoding.Default);
//4. Execute script
var scope = engine.CreateScope();
var lib = new[]
{
"C:\\path\\SamplePy\\packages\\IronPython.2.7.9\\lib",
"C:\\path\\SamplePy\\packages\\IronPython.2.7.9",
};
engine.SetSearchPaths(lib);
engine.ExecuteFile(script, scope);
//source.Execute(scope);
//5. Display output
string str(byte[] x1) => Encoding.Default.GetString(x1);
Console.WriteLine("Errrors");
Console.WriteLine(str(errors.ToArray()));
Console.WriteLine();
Console.WriteLine("Results");
Console.WriteLine(str(results.ToArray()));
}
private void BtnJsonPy\u单击(对象发送方,事件参数e)
{
//1.创建引擎
var engine=Python.CreateEngine();
//2.提供脚本和参数
var script=@“C:\Users\simeh\source\HDFC\repos\SamplePy\SamplePy2\SamplePy2.py”;//提供完整路径
var source=engine.CreateScriptSourceFromFile(脚本);
//发送Python脚本的伪参数
int x=3;
int y=4;
var argv=新列表();
argv.添加(“”);
argv.Add(x.ToString());
argv.Add(y.ToString());
engine.GetSysModule().SetVariable(“argv”,argv);
//3.重定向输出
var eIO=engine.Runtime.IO;
var errors=newmemoryStream();
eIO.SetErrorOutput(错误,编码。默认值);
var结果=新的MemoryStream();
设置输出(结果、编码、默认值);
//4.执行脚本
var scope=engine.CreateScope();
var lib=new[]
{
“C:\\path\\SamplePy\\packages\\IronPython.2.7.9\\lib”,
“C:\\path\\SamplePy\\packages\\IronPython.2.7.9”,
};
引擎设置搜索路径(lib);
engine.ExecuteFile(脚本,范围);
//来源、执行(范围);
//5.显示输出
字符串str(字节[]x1)=>Encoding.Default.GetString(x1);
控制台。写入线(“错误”);
Console.WriteLine(str(errors.ToArray());
Console.WriteLine();
控制台。WriteLine(“结果”);
Console.WriteLine(str(results.ToArray());
}
我在这里遇到的问题是,我不断收到诸如“Json模块错误”或“PIL模块错误”之类的错误
我在某个地方读到,PIL目前不会与IronPython一起工作,因为它使用本机C库
python脚本具有ML逻辑,并使用OCR等进行图像处理,因此需要PIL,这在IronPython中是无法实现的
所以,对于如何从Winform C#应用程序调用Python脚本,有没有更好的方法或建议
提前谢谢 这里是“导入错误”的解决方案打开cmd,进入AppData>Local>Programs>Python>Python37-32,然后写下这个
pip3 install json
如果要从c#运行.py文件,导入模块必须位于python.exe目录中
例如,ı将cv2和其他LIB导入Python37-32目录。在这之后,我的程序运行良好
这是我的代码:
timer1.Enabled = true;
progressBar1.Value += 10;
string myPythonApp = "C://Users//giris//Desktop//staj_proje_son//main.py";
string cmdArguments = "/c \"python " + myPythonApp + " " + "--ogrencioptik " + textBox2.Text + " " + "--cevapkagidi " + textBox1.Text + " " + "--sonuckayit " + textBox3.Text + "\"";
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "cmd.exe";
start.UseShellExecute = false;
start.WorkingDirectory = "C://Users//giris//Desktop//staj_proje_son//";
start.Arguments = cmdArguments;
start.RedirectStandardOutput = false;
start.RedirectStandardError = true;
start.CreateNoWindow = true;
Process process = Process.Start(start);
timer1.Start();
process.WaitForExit();
timer1.Stop();
timer1.Enabled = false;
progressBar1.Value = 100;
MessageBox.Show("İşlem Bitti");
button3.Enabled = true;
注:
所有textbox.text是文件夹的路径 这里是“导入错误”的解决方案打开cmd,进入AppData>Local>Programs>Python>Python37-32,然后写下这个
pip3 install json
如果要从c#运行.py文件,导入模块必须位于python.exe目录中
例如,ı将cv2和其他LIB导入Python37-32目录。在这之后,我的程序运行良好
这是我的代码:
timer1.Enabled = true;
progressBar1.Value += 10;
string myPythonApp = "C://Users//giris//Desktop//staj_proje_son//main.py";
string cmdArguments = "/c \"python " + myPythonApp + " " + "--ogrencioptik " + textBox2.Text + " " + "--cevapkagidi " + textBox1.Text + " " + "--sonuckayit " + textBox3.Text + "\"";
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "cmd.exe";
start.UseShellExecute = false;
start.WorkingDirectory = "C://Users//giris//Desktop//staj_proje_son//";
start.Arguments = cmdArguments;
start.RedirectStandardOutput = false;
start.RedirectStandardError = true;
start.CreateNoWindow = true;
Process process = Process.Start(start);
timer1.Start();
process.WaitForExit();
timer1.Stop();
timer1.Enabled = false;
progressBar1.Value = 100;
MessageBox.Show("İşlem Bitti");
button3.Enabled = true;
注:
所有textbox.text是文件夹的路径 嘿,谢谢你的解决方案。我还没有尝试。但是,我们如何编写“pip3安装json”,我们是否可以同样安装“PIL”模块,或者现有的IronPython模块还不支持它?您可以使用类似pip安装的任何东西。只需在pyhon.exe目录中:)在此目录中安装模块。然后试试我的代码,你会发现它很好用。上面的代码是用于进程间通信的,对我来说很好用。如果我在winforms app.import sys.path.append(“C:\\Program Files(x86)\\IronPython 2.7\\Lib\”)中使用IronPython 2.7.9,当ı在我的.py文件中写入时,模块错误就会出现。ı解决了这个问题。您可以尝试一下吗?我已经为IronPython添加了Nuget包,因此,我得到的唯一路径参考是从我的解决方案项目文件夹路径“C:\\project path\\SamplePy\\packages\\IronPython.2.7.9\\lib”中获得的,所以我要在这里添加模块吗?。我是新来的,所以有很多问题。嘿,谢谢你的解答。我还没有尝试。但是,我们如何编写“pip3安装json”,我们是否可以同样安装“PIL”模块,或者现有的IronPython模块还不支持它?您可以使用类似pip安装的任何东西。只需在pyhon.exe目录中:)在此目录中安装模块。然后试试我的代码,你会发现它很好用。上面的代码是用于进程间通信的,对我来说很好用。如果我在winforms app.import sys.path.append(“C:\\Program Files(x86)\\IronPython 2.7\\Lib\”)中使用IronPython 2.7.9,当ı在我的.py文件中写入时,模块错误就会出现。ı解决了这个问题。您可以尝试一下吗?我已经为IronPython添加了Nuget包,因此,我得到的唯一路径参考是从我的解决方案项目文件夹路径“C:\\project path\\SamplePy\\packages\\IronPython.2.7.9\\lib”中获得的,所以我要在这里添加模块吗?。我是新来的,所以有很多问题。