2015-08-06 1 views
0

Je suis en train d'intégrer la célèbre speedtest-cli.py (speedtest.net client) dans mon application C#, pour que je puisse afficher la sortie soit dans la console ou dans un TexBox.script Python en C# application - problèmes IO

Jusqu'à présent, j'essayé ce qui suit:

class PythonSpeedTest 
{  
    private String path = @"c:\pythonSpeedTest.py"; 

    public void runPython() { 
     var py = Python.CreateEngine(); 
     var scope = py.CreateScope(); 
     var paths = py.GetSearchPaths(); 
     paths.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib"); 
     py.SetSearchPaths(paths); 
     MemoryStream ms = new MemoryStream(); 
     py.Runtime.IO.SetOutput(ms, new StreamWriter(ms));   
     try 
     { 
      var output = py.ExecuteFile(path, scope); 

     } 
     catch (Exception ex) 
     {    
      Console.WriteLine("Python collapsed" + ex.Message); 
     } 
     Thread.Sleep(5000); 
     var sr = new StreamReader(ms); 
     var result = sr.ReadToEnd(); 
     Console.WriteLine(result); 
    } 
} 

L'application semble exécuter le script, mais 1. ne pas attendre jusqu'à ce qu'il se termine, et 2. Je ne pouvais pas le faire afficher tout sortie de python

Idéalement, je dois être en mesure d'attendre jusqu'à ce que le python a terminé le test; les résultats de la capture et de sortie dans la console soit ou TextBox, ou si je pouvais capturer toute la production - ce serait fantastique.

Merci pour votre aide!

+0

Êtes-vous sûr que le script est en cours d'exécution OK? Définissez py.Runtime.IO.SetErrorOutput (stream, writer) pour que vous puissiez voir une erreur. –

+0

Merci! Je dois essayer ça! –

Répondre

0

Très bien !!! Après avoir battu la tête d'un mur pendant quelques jours, j'ai finalement compris. Tout d'abord, je ne devais pas mettre des cours d'eau afin d'obtenir une sortie de python. Voici le code:

class testPython 
{ 
    public void runScript() { 
     String path = @"c:\pythonSpeedTest.py"; 
     var source = System.IO.File.ReadAllText(path);   
     Microsoft.Scripting.Hosting.ScriptEngine py = Python.CreateEngine(); 
     Microsoft.Scripting.Hosting.ScriptScope scope = py.CreateScope(); 
     var paths = py.GetSearchPaths(); 
     paths.Add(@"c:\Program Files (x86)\IronPython 2.7\Lib"); 
     py.SetSearchPaths(paths); 
     try { 
      py.Execute(source); 
     }catch (Exception ex){ 
      Console.WriteLine("Error occured in python script\n"+ex); 
      Console.ReadKey(); 
      return; 
     } 
    } 
} 

L'important était de définir les chemins pour le moteur de python. Le principal problème était que j'avais lancé le script dans la canopée en appuyant sur le bouton de lecture (désolé je suis tout à fait un noob), mais dans le script lui-même, je n'ai jamais besoin d'appeler simplement main(). Une fois que je l'ai ajouté - le script a été joliment exécuté sous mon application C#. Obtenir des données sera facile maintenant.

J'espère que ça va sauver quelqu'un!