Как обеспечить завершение процесса перед запуском команды на CMD? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть небольшое приложение, которое загружает и устанавливает Python, а затем устанавливает список библиотек Python с помощью pip.

Я использую метод Process.WaitForExit (), чтобы убедиться, что установкаPython завершен, прежде чем я начну установку библиотек. Ниже приведен мой код для установки Python

 public void installPython()
        {
            Process process = new Process();
            process.StartInfo.FileName = @"C:\Python36\python-3.6.3-amd64.exe";
            process.Start();
            process.WaitForExit();

        }

Ниже приведен код, который затем запускает cmd и выполняет команду pip:

public void installLibraries()
        {

            int exitCode;
            string command = "pip install -r requirements.txt";
            ProcessStartInfo processInfo;
            Process process;

            processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
            processInfo.CreateNoWindow = true;
            processInfo.UseShellExecute = false;

            processInfo.RedirectStandardError = true;
            processInfo.RedirectStandardOutput = true;

            process = Process.Start(processInfo);
            process.WaitForExit();


            string error = process.StandardError.ReadToEnd();

            exitCode = process.ExitCode;

            Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
            Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
            Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
            process.Close();
        }

Затем в методе Main я вызываю метод installPython изатем метод installLibraries

К сожалению, скомпилированный .exe не соответствует правильному порядку. Когда я запускаю команду из cmd после просмотра каталога, я получаю сообщение об ошибке:

output>>(none)
error>>'pip' is not recognized as an internal or external command,
operable program or batch file.

Ошибка в использовании функций процесса?

1 Ответ

0 голосов
/ 07 ноября 2019

Это процесс запуска и ожидания до завершения.

        public static void StartProcessAndWait(string processFile, string arguments, string workingDirectory)
        {
            var proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = processFile,
                    Arguments = arguments,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true,
                    RedirectStandardError = true,
                    WorkingDirectory = workingDirectory
                }
            };

            proc.Start();


            var _ = ConsumeReader(proc.StandardOutput);
            // ReSharper disable once RedundantAssignment
            _ = ConsumeReader(proc.StandardError);

            async Task ConsumeReader(TextReader reader)
            {
                string text;

                while ((text = await reader.ReadLineAsync()) != null)
                    Console.WriteLine(text);
            }

            proc.WaitForExit(30000);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...