2010-12-23 75 views
1

我试图简单地将我的程序(使用C#编写)的标准输出传输到另一个程序(例如python脚本)。我的代码只是使用Console.Write()写入标准输出,而当我不是管道时,这很好。 listen命令仅使用Console.Write()从设置的套接字传入时从单独的线程写入数据。C#或Python管道阻塞

[作品 - 写入数据,因为它被接收到控制台]

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); 
      } 
     } 
    } 
} 
+0

您应该尝试缩小问题范围;对于初学者来说,编写一个简单的C#程序,除了写入标准输出流之外什么也不做。如果可行,那么在现有程序中设置断点以查看它是否实际上到达控制台方法。 – Aaronaught 2010-12-23 16:03:44

+0

我做了一个非常简单的程序来测试两件事情。来自“简明英汉词典2.写出标准的单独线程不是问题。然后我将它传送到filter.py,并且都工作。我将发布我用作编辑的简单程序。设置断点的问题是我无法找出一种在VS 2008中用管道调试程序的方法。 – blastthisinferno 2010-12-23 17:38:34

回答

0

请问您的节目写入新行或在其标准输出调用flush?也许它是缓冲的,这就是为什么你什么都看不到。

0

你可能想看看here并搜索“死锁”。

也许它会有所帮助。

0

你的python程序需要2个EOF字符来终止。尝试这个。

import sys 

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