作为Unity3D C#进程连续运行Python解释器

时间:2018-10-21 20:43:21

标签: c# python unity3d process

我正在尝试将Python库集成到Unity3D中。不幸的是,我无法使用IronPython,因为必须使用.pyd,这是使用Boost Python编译C ++库的结果。

因此,我只是想让一个进程在内部使用Python解释器运行,而我只是在解释器中同步调用函数并读取输出。我需要解释器保持生命,因为它需要随着时间的推移保持状态。

不幸的是,我要尝试执行的操作无法正常工作,而且我不确定自己缺少什么。

    var process = new System.Diagnostics.Process();
    process.StartInfo.FileName = "python";
    process.StartInfo.Arguments = "-i";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardOutput = true;

    process.Start();

    var input = process.StandardInput;
    var error = process.StandardError;
    var output = process.StandardOutput;

    string line;

    // This would ideally "purge" the initial output from Python, 
    // even though for some reason it is terminating the process.
    Debug.Log("first output:");
    while ((line = output.ReadLine()) != null)
        Debug.Log(line);
    Debug.Log("first error");
    while ((line = error.ReadLine()) != null)
        Debug.Log(line);

    // Here I try to pass some commands to the Python interpreter.
    // Even if I remove the outputs from before, I only get
    // "invalid syntax errors" from Python.
    Debug.Log("Passing input");
    input.WriteLine("print('test')");

    // Try to read the 'test' output from Python.
    Debug.Log(output.ReadLine());

    // Exit the interpreter
    input.WriteLine("exit()");

    process.WaitForExit();
    process.Close();

我认为这里存在多个错误,从我试图“刷新” Python进程的输出到我试图传递输入的方式不同,但我不确定该怎么做

编辑:我认为通过向Python发送一些空行来“刷新”输入可解决我的输入问题。

另一方面,似乎不可能从正在运行的Process同步获取输出,因为没有非阻塞方法来检查是否还有更多要读取的输出。甚至Peek也似乎挂死了。我仍在调查中。.

0 个答案:

没有答案