C#或Python管道阻塞

时间:2010-12-23 15:38:32

标签: c# python console-application pipe stdin

我试图简单地将我的程序的标准输出(用C#编写)传递给另一个程序(例如python脚本)。我的代码只是使用Console.Write()写入标准输出,当我没有管道时,它可以正常工作。 listen命令只是使用Console.Write()从设置的套接字进入时从单独的Thread写入数据。

[Works - 在收到数据时将数据写入控制台]

myProgram.exe listen

[不起作用 - 没有任何内容写入控制台]

myProgram.exe listen | python filter.py

我不完全确定出了什么问题,并没有想到解决这个问题的方法。我的猜测是问题与接收线程以某种方式阻止标准输出从管道数据到另一个进程,但我不知道如何测试它。我正在寻找任何有关于问题可能实际存在的想法的人,或者是进一步解决这个问题的方法。如果你需要代码来帮助我,我愿意发帖子。

如何判断问题出在C#还是Python中?

编辑:请注意,重定向运算符(> )确实有效。所以, myProgram.exe listen>实际上,log.txt 确实将写入标准的数据写入 log.txt 文件。我也尝试过跟http://linux.byexamples.com/archives/343/python-handle-string-from-pipelines-and-list-of-param/的例子。

[filter.py]

import sys
for line in sys.stdin:
    sys.stdout.write(line)

编辑:控制台反馈

我认为这值得一提。 python脚本被调用,但在等待30秒后(它应该立即开始输出到标准输出)我按 Ctrl + C 来停止该过程并得到以下内容。

>> myProgram.exe listen | python filter.py
Traceback (most recent call last):
  File "filter.py", line 2, in 
    for line in sys.stdin:
KeyboardInterrupt
^C

编辑:@Aaronaught

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace echo
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                foreach (string arg in args)
                {
                    Console.Out.WriteLine(arg);
                }
            }
            else
            {
                Thread thread = new Thread(new ThreadStart(Receive));
                thread.Start();
                thread.Join();
            }
        }

        static void Receive()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.Out.WriteLine(i);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您的程序是否在其标准输出上写入换行符或调用flush?也许它是缓冲的,这就是为什么你看不到任何东西。

答案 1 :(得分:0)

您可能需要查看here并搜索“死锁”。

也许会有所帮助。

答案 2 :(得分:0)

您的python程序需要2个EOF字符才能终止。试试这个。

import sys

line=sys.stdin.readline()
while len(line):
    sys.stdout.write(line)
    line=sys.stdin.readline()