如何避免使用c#和Python避免管道破裂?

时间:2018-12-31 18:09:54

标签: c# python pipe

当尝试在C#(Unity)中使用stdin和stdout传递到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 :(得分:0)

经过一番实验,我发现添加了

pyStreamReader.DiscardBufferedData();

之前

pyStreamWriter.WriteLine(str);

解决了主要问题,这种简单的管道形式似乎可以工作,至少对于我观察到的数百笔交易而言。

我还必须在范围之外声明pyProcess,以便代码不会释放其句柄。那解决了ObjectDisposed异常。