Я хочу вызвать скрипт Python из моего приложения Winform C #. Я проверил некоторые решения и следовал следующим подходам. Один использует межпроцессное взаимодействие, другой использует IronPython
Подход 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 будет запускаться локально в системе.
Подход 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()));
}
Проблема, с которой я столкнулся, заключается в том, что я продолжаю получать ошибки, такие как «Ошибка модуля Json» или «Ошибка модуля PIL»
Я где-то читал, что PIL в настоящее время не будет работать с IronPython, потому что он использует собственную библиотеку C.
Сценарий python имеет логику ML и использует OCR и т. Д. Для обработки изображений и, следовательно, требует PIL, чего нельзя сделать в IronPython.
Так что любой лучший подход или способы или предложения о том, как вызвать скрипт Python из приложения Winform C #.
Заранее спасибо !!! ..