Имея этот код:
Process checkForUpdates = new Process();
checkForUpdates.StartInfo.FileName = @"python";
checkForUpdates.StartInfo.Arguments = "-V";
checkForUpdates.StartInfo.UseShellExecute = true;
checkForUpdates.StartInfo.RedirectStandardOutput = true;
checkForUpdates.StartInfo.RedirectStandardError = true;
checkForUpdates.StartInfo.CreateNoWindow = false;
checkForUpdates.EnableRaisingEvents = true;
checkForUpdates.Start();
string result = checkForUpdates.StandardOutput.ReadToEnd();
Я пытаюсь получить вывод команды python -V, чтобы определить, установлен ли python на устройстве.
Приведенный выше код компилируется, но кажется, что код зависает во время процесса без каких-либо ошибок. Тот же код отлично работает на UWP.
Есть ли другой способ заставить его работать на Android?
Ваш код будет зависать до тех пор, пока в стандартном выводе не будет обнаружен EOF, чего никогда не произойдет, пока скрипт python не завершится. Когда python завершает работу, стандартный вывод удаляется, поэтому вы не получаете никаких данных. Я рекомендую читать из StandardOutput, используя метод, отличный от ReadToEnd().
Если его нет на пути, разве я не должен получить сообщение об ошибке? @jdweng Проблема в том, что даже если я ничего не читаю, сценарий никогда не завершается. Я попытался использовать вывод чтения, используя checkForUpdates.OutputDataReceived += (s, er) => { Debug.WriteLine(er.Data);}; но результат тот же
Также я не запускаю какой-либо скрипт Python. Команда -V возвращает только версию Python, если она установлена.
Существует разница между End-Of-Stream и End-Of-File. Когда у вас есть файл, открытый в Windows, и вы дойдете до конца файла, Windows автоматически закроет файл/поток, а затем приложение С# получит EOF. С потоком, если приложение не закроет поток, вы ничего не получите. Положение потока будет в последнем местоположении, но вы не получите никаких указаний, если не проверите положение. Windows предполагает, что процесс заполнения потока добавит больше данных. Чтобы получить EOF, скрипт Python должен закрыть стандартный вывод.
@jdweng, так что если я удалю строку result = checkForUpdates.StandardOutput.ReadToEnd(); Не будет разницы? стандартный вывод по-прежнему вызывается по умолчанию? Так как в любом случае я вообще не получаю вывода, и я не могу выполнить код после запуска процесса.





Проблема заключалась в том, что я запускаю этот код внутри фонового рабочего. Я поместил код в метод непосредственно внутри ViewModel, и он отлично работал.
это, кажется, предполагает, что python находится на пути... что, если это не так?