Вызов скрипта Python из приложения Winform C # - PullRequest
1 голос
/ 03 июля 2019

Я хочу вызвать скрипт 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 #.

Заранее спасибо !!! ..

1 Ответ

0 голосов
/ 03 июля 2019

Решение здесь для «ошибки импорта», откройте cmd и перейдите в AppData> Local> Programs> Python> Python37-32, затем напишите это

pip3 install json

, если вы хотите запустить .py файл изc # модули импорта должны находиться в каталоге python.exe

, например, я импортировал cv2 и другие библиотеки в каталог 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 является путем к папке.

...