Повторно выполнять python команды из C# на CommandLine, используя только один процесс - PullRequest
0 голосов
/ 17 января 2020

Я уже несколько дней пытаюсь решить эту проблему и не могу понять. Я написал C#. net код, который вызывает python код в al oop и каждый раз передает разные параметры. Код python выполняет обработку данных и записывает результаты в файл.

Ниже приведен фрагмент рабочего кода, который вызывается в итерации

            var TrainProcess = new Process();
            ProcessStartInfo startTrain = new ProcessStartInfo();
            startTrain.FileName = @"python";
            startTrain.Arguments = @"sklearn\Regression.py " + TrainParams + string.Format(" --trn {0} --tst {1}", ScaledTraining, ModelPath);
            startTrain.CreateNoWindow = true;
            startTrain.UseShellExecute = false;
            startTrain.RedirectStandardOutput = true;
            startTrain.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

            TrainProcess.StartInfo = startTrain;
            TrainProcess.Start();
            TrainProcess.WaitForExit();`

Этот код работает нормально, но он очень медленный потому что каждый раз вызывается около пяти python импортов, и это алгоритм оптимизации, при котором файл python вызывается тысячи раз. Я обнаружил, что время импорта более чем вдвое превышает само время обработки данных !!.

Я пытался решить эту проблему, избегая создания нового процесса на каждой итерации и открывая интерпретатор python для процесса CMD, читая python кодируют строки из файла .py и отправляют python команды из C# несколько раз следующим образом:

string Script = "";
            using (TextFieldParser parser = new TextFieldParser(@"sklearn\Regression.py"))
            {

                    Script = parser.ReadToEnd();
            }
// some string  processing to set up python variables
            for (int i = 0; i < Argv.Count(); i++)
            {
                string arg = Argv[i];
                if (arg[0] == '-')
                    Script = Script.Replace(arg, Argv[i + 1]);
            }
            inputWriter.WriteLine(Script);
            TrainProcess.StandardInput.Flush();

Этот код предназначен для python, чтобы выполнить импорт, и все в один сеанс интерпретатора python, который импортирует импорт один раз и пропускается в последующих итерациях. Теперь, когда я вставляю отправленный скрипт в терминал CMD, чтобы проверить его. Работает нормально и обновляет выходной файл. Однако он ничего не делает при запуске из C#, если только inputWriter не вызывает Close (). как будто сценарий не записан или сброшен, за исключением случаев, когда писатель закрыт. Очевидно, что я не хочу закрывать модуль ввода и держать его открытым для написания большего количества команд в следующих итерациях.

Я надеюсь, что смогу объяснить проблему и поблагодарить вас за помощь.

...