如何在C# Stream和Python脚本之间重复传递输入和输出?

4
我正在尝试在C#中以流的形式运行Python脚本,并使用StreamWriter和StreamReader在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");
            }
        }
    }
}

Python代码如下所示:

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

我不清楚为什么会出现这种情况,也不知道解决方案是什么,所以非常感谢任何帮助。

2个回答

3

我找到了解决我的问题的方法。但我不太确定它为什么有效。 对于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");
            }
        }
    }
}

这是Python代码:

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()

0
这是一个传统的流问题。 你必须“刷新”流(如 stdout.flush(),其中 stdout 是流对象), 无论在 C# 还是 Python 中, 才能发送数据。 在 C# 中,据我所知,必须执行 stream.Close() 来完成刷新本身, 或者可以使用“using”将流包装起来, 当括号关闭时它会发送数据。
编辑: 顺便说一句,流每次只能被一端使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接