Некоторые команды Python не попадают в стандартный вывод - PullRequest
1 голос
/ 24 февраля 2010

Я написал простую программу, которая захватывает и выполняет скрипты Python для командной строки, но есть проблема. Текст, переданный в функцию ввода Python, не записывается в мою программу, несмотря на то, что моя программа захватывает стандартный вывод.

Например: Скрипт Python:

import sys

print("Hello, World!")
x = input("Please enter a number: ")
print(x)

print("This work?")

написал бы "Привет, мир!" тогда остановись Когда я передаю ему номер, он продолжает писать «Пожалуйста, введите номер: 3». Что здесь происходит? Любые решения? Мой C # выглядит следующим образом:

public partial class PyCon : Window
{
        public string strPythonPath;
        public string strFile;
        public string strArguments;
        private StreamWriter sw;

        public PyCon(string pythonpath, string file, string args)
        {
            strPythonPath = pythonpath;
            strFile = file;
            strArguments = args;

            InitializeComponent();

            Process p = new Process();

            p.StartInfo.FileName = strPythonPath;
            p.StartInfo.Arguments = "\"" + strFile + "\" " + strArguments;

            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;

            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;

            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
            p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);

            p.Start();
            p.BeginOutputReadLine();
            p.BeginErrorReadLine();
            sw = p.StandardInput;
        }

        private void p_OutputDataReceived(object sendingProcess, DataReceivedEventArgs received) {
            if (!String.IsNullOrEmpty(received.Data)) {
                AppendConsole(received.Data);
            }
        }

        private void p_ErrorDataReceived(object sendingProcess, DataReceivedEventArgs received) {
            if (!String.IsNullOrEmpty(received.Data)) {
                AppendConsole(received.Data);
            }
        }

        private void AppendConsole(string message) {
            if (!txtConsole.Dispatcher.CheckAccess()) {
                txtConsole.Dispatcher.Invoke(DispatcherPriority.Normal, (System.Windows.Forms.MethodInvoker)delegate() { txtConsole.AppendText(message + "\n"); });
            } else {
                //Format text
                message = message.Replace("\n", Environment.NewLine);

                txtConsole.AppendText(message + "\n");   
            }
        }

        private void txtInput_KeyUp(object sender, KeyEventArgs e) {
            if (e.Key != Key.Enter) return;

            sw.WriteLine(txtInput.Text);

            txtInput.Text = "";


        }
    }

Редактировать: После долгих исследований и помощи из этого потока я пришел к выводу, что проблема в том, что входная команда Python не вызывает C # DataReceivedEventHandler. Там может быть не решение этой проблемы, кроме изменения сценариев. Если это так, я сделаю ответ, содержащий эти изменения, как принято. Спасибо за помощь, ребята!

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Сложно сказать, потому что я использую python 2.6, а вы, кажется, используете 3.x, и я также довольно давно не программировал на c #, но я предполагаю, что эта строка:

sw.WriteLine(txtInput.Text);

Отправляет «3» плюс символ новой строки Windows.

Попробуйте:

sw.Write(txtInput.Text + "\n")
sw.Flush()

Это просто отправит обычный символ новой строки вместо возврата каретки Windowsчто может быть проблемой.Убедитесь, что вы всегда очищаете при работе со сложным потоковым обменом, подобным этому!

Еще одна вещь, убедитесь, что вы можете просто перенаправить ее в командной строке.Слишком часто программисты пытаются делать все одновременно и застревают:

./stdintest.py < input.txt

Если это не сработает, это не сработает в C #.Удачи

1 голос
/ 24 февраля 2010

Пахнет, как будто Python ввод / вывод буферизуется строкой, то есть ждет CRLF, а затем отправляет всю строку сразу. Вы можете попробовать отключить это ( python -u myscript.py или установить переменную окружения PYTHONUNBUFFERED ) или обойти это примерно так:

print("Hello, World!")
print("Please enter a number: ")
x = input()
print(x)
...