J'ai écrit un programme simple qui capture et exécute des scripts Python en ligne de commande, mais il y a un problème. Le texte passé à une fonction d'entrée Python n'est pas écrit dans mon programme malgré la capture de mon programme stdout.Certaines commandes Python ne sont pas interceptées dans Stdout
Par exemple: Le script Python:
import sys
print("Hello, World!")
x = input("Please enter a number: ")
print(x)
print("This work?")
écrirait "Bonjour, monde!" puis arrêtez. Quand je lui passe un numéro, il continue à écrire "S'il vous plaît entrer un nombre: 3". Que se passe-t-il? Des solutions? Mon C# est la suivante:
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 = "";
}
}
Edit: Après beaucoup de recherches et l'aide de ce fil, je suis venu à la conclusion que le problème est avec la commande d'entrée Python ne pas appeler la C# DataReceivedEventHandler. Il n'y a peut-être pas de solution à cela en plus des changements de script. Si tel est le cas, je vais faire la réponse contenant ces changements comme acceptés. Merci pour l'aide les gars!
La solution de contournement de script est géniale. Cela corrige le problème, mais ce n'est pas idéal. La définition de PYTHONUNBUFFERED ou l'exécution du script avec -u ne semblent pas corriger le problème. –