Я написал простую программу, которая захватывает и выполняет скрипты 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. Там может быть не решение этой проблемы, кроме изменения сценариев. Если это так, я сделаю ответ, содержащий эти изменения, как принято. Спасибо за помощь, ребята!