.NET перехваченный STDOUT из Python всегда пуст в Unity - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь использовать программу Python для отправки непрерывного потока информации из одной программы в другую, например этот вопрос , но в байтовой форме.

pythonPath иpythonScript - это просто расположение файлов скрипта и python.exe.

C # код

public static void PythonKernel_Test() {
    Process pythonProcess = Process.Start(new ProcessStartInfo() {
        FileName = pythonPath,
        Arguments = pythonScript,
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        UseShellExecute = false,
        CreateNoWindow = true
    });
    Stream pythonStdOut = pythonProcess.StandardOutput.BaseStream;
    for (int i = 0; i < 1000; i++) {
        byte[] buffer = new byte[256];
        pythonStdOut.Read(buffer, 0, 256);
        Debug.Log(Encoding.ASCII.GetString(buffer) + Environment.NewLine + BitConverter.ToString(buffer));
    }
    pythonStdOut.Close();
}

Хотя это в Unity, вы можете просто заменить Debug.Log на Console.WriteLine().

Однако, хотя я спамлю stdout с SYNC, на стороне C # ничего не появляется.Однако он появляется в командной строке при запуске из оболочки.

Код Python

w = sys.stdout.buffer
while True:
    w.write(b"SYNC\n")
    sys.stdout.flush()

1 Ответ

0 голосов
/ 22 сентября 2019

Вот рабочий пример, чтобы попробовать

public static void PythonKernel_Test()
{
    var pi = new ProcessStartInfo
    {
        FileName = "python",
        Arguments = "test.py",
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true,
    };
    var pythonProcess = new Process
    {
        StartInfo = pi,
    };

    pythonProcess.OutputDataReceived+= (s,e) => 
    {
        Console.WriteLine("OUT: {0}",e.Data);
    };
    pythonProcess.ErrorDataReceived+= (s,e) => 
    {
        Console.WriteLine("ERR: {0}",e.Data);
    };

    pythonProcess.Start();
    pythonProcess.BeginOutputReadLine();
    pythonProcess.BeginErrorReadLine();
    pythonProcess.WaitForExit();
}

Он будет читать вывод асинхронно

Взят из https://stackoverflow.com/a/29753402/1744164

test.py

import sys

while True:
    sys.stdout.write(b"SYNC\n")
    sys.stdout.flush()
...