2014-11-12 5 views
0

Я пытаюсь запустить скрипт Python из C# в качестве потока, а затем до передавать входы и выходы между Python и потоком, используя StreamWriter и StreamReader.Как многократно передавать входы и выходы между C# Stream и скриптом Python?

Я могу читать и писать, , но, видимо, один раз, а не несколько раз. (Это то, что мне нужно.) Надеюсь, кто-то может сказать мне, что я делаю неправильно.

(Я знаю, что я, вероятно, могу делать то, что мне нужно делать, читая и записывая файл. Однако я бы хотел избежать этого, если смогу, поскольку использование Stream кажется более чистым.)

Вот мой C# код:

using System; 
using System.Diagnostics; 
using System.IO; 

public class Stream_Read_Write 
{ 
    public static void Main() 
    { 
     string path = "C:\\Users\\thomas\\Documents\\Python_Scripts\\io_test.py"; 
     string iter = "3"; 
     string input = "Hello!"; 

     stream_read_write(path, iter, input); 

     //Keep Console Open for Debug 
     Console.Write("end"); 
     Console.ReadKey(); 
    } 

    private static void stream_read_write(string path, string iter, string input) 
    { 
     ProcessStartInfo start = new ProcessStartInfo(); 

     start.FileName = "C:\\Python27\\python.exe"; 
     start.Arguments = string.Format("{0} {1}", path, iter); 
     start.UseShellExecute = false; 
     start.RedirectStandardOutput = true; 
     start.RedirectStandardInput = true; 
     start.CreateNoWindow = true; 

     using (Process process = Process.Start(start)) 
     using (StreamWriter writer = process.StandardInput) 
     using (StreamReader reader = process.StandardOutput) 
     { 
      for (int i = 0; i < Convert.ToInt32(iter); i++) 
      { 
       Console.WriteLine("writing..."); 
       writer.WriteLine(input); 
       writer.Flush(); 
       Console.WriteLine("written: " + input + "\n"); 

       Console.WriteLine("reading..."); 
       string result = reader.ReadLine(); 
       Console.WriteLine("read: " + result + "\n"); 
      } 
     } 
    } 
} 

Питон код выглядит следующим образом:

import sys 

iter = int(sys.argv[1]) 

for i in range(iter): 
    input = raw_input() 
    print (input) 

И это выход, который я получаю:

writing... 
written: Hello! 

reading... 

Странно, когда я удаляю петли как с Python, так и с C#, он работает. (для одной итерации)

writing... 
written: Hello! 

reading... 
read: Hello! 

end 

Это мне не понятно, почему это происходит, или то, что решение может быть, поэтому любая помощь очень ценится.

ответ

0

Я нашел решение моей проблемы. Я не совсем уверен, почему это работает. Для C#:

using System; 
using System.Diagnostics; 
using System.IO; 

public class Stream_Read_Write 
{ 
    public static void Main() 
    { 
     string path = "C:\\Users\\thomas_wortmann\\Documents\\Python_Scripts\\io_test.py"; 
     string iter = "3"; 
     string input = "Hello"; 

     stream_read_write(path, iter, input); 

     //Keep Console Open for Debug 
     Console.Write("end"); 
     Console.ReadKey(); 
    } 

    private static void stream_read_write(string path, string iter, string input) 
    { 
     ProcessStartInfo start = new ProcessStartInfo(); 

     start.FileName = "C:\\Python27\\python.exe"; 
     start.Arguments = string.Format("{0} {1}", path, iter); 
     start.UseShellExecute = false; 
     start.RedirectStandardOutput = true; 
     start.RedirectStandardInput = true; 
     start.CreateNoWindow = true; 

     using (Process process = Process.Start(start)) 
     using (StreamWriter writer = process.StandardInput) 
     using (StreamReader reader = process.StandardOutput) 
     { 
      for (int i = 0; i < Convert.ToInt32(iter); i++) 
      { 
       writer.WriteLine(input + i); 
       Console.WriteLine("written: " + input + i); 

       string result = null; 

       while (result == null || result.Length == 0) 
       { result = reader.ReadLine(); } 

       Console.WriteLine("read: " + result + "\n"); 
      } 
     } 
    } 
} 

И код питона выглядит следующим образом:

import sys 

def reverse(input): 
    return input [::-1] 

iter = int(sys.argv[1]) 

for i in range(iter): 
    input = sys.stdin.readline() 
    print reverse(input) 
    sys.stdout.flush()