当尝试在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#
答案 0 :(得分:0)
经过一番实验,我发现添加了
pyStreamReader.DiscardBufferedData();
之前
pyStreamWriter.WriteLine(str);
解决了主要问题,这种简单的管道形式似乎可以工作,至少对于我观察到的数百笔交易而言。
我还必须在范围之外声明pyProcess,以便代码不会释放其句柄。那解决了ObjectDisposed异常。