Труба на процесс Python из C # Unity - PullRequest
0 голосов
/ 11 октября 2018

У меня есть приложение Unity (C #), которое вызывает скрипт python, инициализируя дочерний процесс.

При попытке записать в python std :: in я, кажется, получаю

write fault on path

ошибка при записи в STD :: IN.

При чтении из STD :: OUT процесса я получаю нулевое значение в качестве выходного значения.

Какой лучший способканал к процессу Python для ввода / вывода?

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using System.Diagnostics;

public class PythonCaller : MonoBehaviour
{
private string buffer = "";
private Process pythonML;

// Use this for initialization
void Start () {
    this.pythonML = new System.Diagnostics.Process();
    this.pythonML.StartInfo.FileName = "/bin/bash";
    this.pythonML.StartInfo.Arguments =
        "{{path to python executable}}/python {{path to python script}}/test.py";
    this.pythonML.StartInfo.UseShellExecute = false;
    this.pythonML.StartInfo.RedirectStandardInput = true;
    this.pythonML.StartInfo.RedirectStandardOutput = true;
    this.pythonML.StartInfo.RedirectStandardError = true;
    this.pythonML.Start();
    this.pythonML.BeginOutputReadLine();
    this.pythonML.OutputDataReceived += new DataReceivedEventHandler((sender, e) => {
        UnityEngine.Debug.Log(e.Data);
    });
    this.pythonML.WaitForExit();
}

// Update is called once per frame
void Update () {
    foreach (char c in Input.inputString) {
        if (c == '\b') {
            if (this.buffer.Length > 0) {
                this.buffer = this.buffer.Substring(0, this.buffer.Length - 1);
            }
        } else if (c == '\n' || c == '\r') {
            try {
                UnityEngine.Debug.Log(this.buffer);
                this.pythonML.StandardInput.WriteLine(this.buffer);

            }
            catch (IOException e) {
                UnityEngine.Debug.Log(e.Message);
            }

            this.buffer = "";
        } else {
            this.buffer += c;
        }
    }
}

}

КОД ПИТОНА:

print('hello world!')

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

То, как вы пишете в StandardInput со стороны C #, - это то, как я ожидал бы, что это будет работать, учитывая это и предполагая, что вы уже пытались запустить свой метод с process.StartInfo.RedirectStandardInput, установленным вtrue.Таким образом, единственный способ увидеть, что это не работает, - это если ваш код Python (который вы должны прикрепить к вопросу) не читал stdin правильно.

Согласно this , вы можете сделать это либо читая sys.stdin как файл, запрашивая у пользователя ввод данных, либо получая аргументы командной строки.Поскольку вы заявили, что ваша Python-программа в данный момент работает, я предполагаю, что вы хотите использовать для этого либо read, либо readlines.Обратите внимание, что после того, как вы это сделали, вы должны раскомментировать process.StartInfo.RedirectStandardInput = true;.

0 голосов
/ 11 октября 2018

Я думаю, вам нужно перенаправить стандартный ввод, чтобы это работало.У вас уже есть эта строка, она просто закомментирована.

process.StartInfo.RedirectStandardInput = true;

Проверьте этот пример MSDN для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...