2010-01-18 7 views
4

Nous IronPython dans notre application intégrer sanglot que les scripts peuvent être exécutés dans le cadre de notre application.sortie en streaming IronPython à mon éditeur

J'utilise Python.CreateEngine() et ScriptScope.Execute() pour exécuter des scripts python.

Nous avons en propre éditeur (écrit en C#) qui peut charger des scripts IronPython et l'exécuter.

Il y a 2 problèmes que je dois résoudre.

  1. Si j'ai une déclaration d'impression dans le script IronPython, comment puis-je montrer mon éditeur (comment vais-je dire à moteur de python pour rediriger la sortie vers un certain gestionnaire dans mon code C#)

  2. Je prévois utilisez unittest.py pour exécuter unittest. Quand je lance le coureur suivant = unittest.TextTestRunner() runner.run (testsuite)

la sortie est redirigée vers la sortie standard, mais besoin d'un moyen pour être redirigé vers mon C# fenêtre de sortie de l'éditeur afin cet utilisateur peut voir les résultats. Cette question pourrait être liée à 1

Toute aide est appréciée G

Répondre

6

Vous pouvez fournir un flux personnalisé ou TextWriter qui sera utilisé pour toutes les sorties. Vous pouvez fournir ceux-ci en utilisant l'une des surcharges ScriptRuntime.IO.SetOutput. Votre mise en œuvre de flux ou TextWriter doit recevoir les chaînes et les sorties à la fenêtre de l'éditeur (potentiellement marshalling en arrière sur le thread d'interface utilisateur si vous exécutez le script sur un thread d'exécution 2ndary).

3

Voici un extrait pour envoyer la sortie vers un fichier.

 System.IO.FileStream fs = new System.IO.FileStream("c:\\temp\\ipy.log", System.IO.FileMode.Create); 
     engine.Runtime.IO.SetOutput(fs, Encoding.ASCII); 

Pour envoyer l'interface graphique à un contrôle de l'interface utilisateur, comme une zone de texte, vous devez créer votre propre flux et l'ont mise en oeuvre d'une méthode d'écriture qui imprimerait à la zone de texte.

2

Vous devez d'abord rediriger la sortie du moteur à la console



    engine.Runtime.IO.RedirectToConsole(); 

Ensuite, vous devez rediriger le NET Console Out à un TextWriter TextBox personnalisé. Ici, votre TextBox est txtBoxTarget



    // set application console output to the output text box 
    Console.SetOut(TextWriter.Synchronized(new TextBoxWriter(txtBoxTarget))); 

Enfin vous devez mettre en œuvre le TextWriter TextBox personnalisé.

using System; 
using System.IO; 
using System.Windows.Forms; 

namespace PythonScripting.TestApp 
{ 
    class TextBoxWriter : TextWriter 
    { 
     private TextBox _textBox; 

     public TextBoxWriter(TextBox textbox) 
     { 
      _textBox = textbox; 
     } 


     public override void Write(char value) 
     { 
      base.Write(value); 
      // When character data is written, append it to the text box. 
      _textBox.AppendText(value.ToString()); 
     } 

     public override System.Text.Encoding Encoding 
     { 
      get { return System.Text.Encoding.UTF8; } 
     } 
    } 
} 

simple, vraiment.