Как избежать разрыва труб с использованием C # и Python? - PullRequest
0 голосов
/ 31 декабря 2018

При попытке использовать stdin и stdout в C # (Unity) для конвейерной передачи в процесс Python, я получаю около десятка или около того транзакций, и процесс прерывается и появляется ошибка «ObjectDisposedException: объект использовался после удаления».

Попробовав несколько более очевидных вещей, я привожу здесь проблему, возможно, кто-то знает только правильную технику.Заранее спасибо.

Вот код запуска C #:

Process pyProcess;    // <=== fixed
ProcessStartInfo pyStartInfo;
public StreamReader pyStreamReader;
public StreamWriter pyStreamWriter;


public void startPython()
{

    // Create new process start info
    pyStartInfo = new ProcessStartInfo(pyPath)
    {
         UseShellExecute = false,
         RedirectStandardInput = true,
         RedirectStandardOutput = true,
         Arguments = pyApp + " " + pyArgs
    };

pyProcess = new Process { StartInfo = pyStartInfo };
pyProcess.Start();
pyStreamReader = pyProcess.StandardOutput;
pyStreamWriter = pyProcess.StandardInput;
pyStreamWriter.WriteLine("Hello!");
string str = pyStreamReader.ReadLine();
Debug.LogFormat(str + "\n");
}


void Start()
{
    if(testPython == true)
        startPython();

Вот фрагмент, который генерирует данные, отправляемые Python при каждом обновлении ...

if (controller.testPython)
{
    string str, python;
    str = String.Format("data to send");
    pyStreamWriter.DiscardBufferedData();  #<==== fixed
    pyStreamWriter.WriteLine(str);
    python = pyStreamReader.ReadLine();
    Debug.LogFormat("python says: " + python + "\n");
    }

А вотупрощенный процесс Python, который повторяет данные

while True:
    cmd = input()        # read a command from c#
    print(cmd)  # process the cmd, here we just echo it back to c#

1 Ответ

0 голосов
/ 01 января 2019

После небольшого эксперимента я обнаружил, что добавление

pyStreamReader.DiscardBufferedData();

перед

pyStreamWriter.WriteLine(str);

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

Мне также пришлось объявить pyProcess вне области видимости, чтобы код не высвобождался.Это разрешило исключение ObjectDisposed.

...