【问题标题】:How to repeatedly pass inputs and outputs between a C# Stream and a Python Script?如何在 C# Stream 和 Python 脚本之间重复传递输入和输出?
【发布时间】:2015-01-08 23:06:00
【问题描述】:

我正在尝试将 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

我不清楚为什么会发生这种情况,或者解决方案可能是什么,因此非常感谢任何帮助。

【问题讨论】:

    标签: c# python io stream read-write


    【解决方案1】:

    我找到了解决问题的方法。不过,我不确定为什么会这样。 对于 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()
    

    【讨论】:

      【解决方案2】:

      这是一个传统的流问题。 您必须“刷新”流 (例如 stdout.flush() ,其中 stdout 是一个流对象) 为了发送数据 无论是在 C# 中还是在 Python 中。 据我所知,在 C# 中,您必须执行 stream.Close() 完成冲洗本身, 或者您可以使用“使用”来包装流 并在括号关闭时发送数据。

      编辑: 顺便说一句,流一次只能在一侧使用。

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多