【问题标题】:C# or Python Pipe BlockedC# 或 Python 管道阻塞
【发布时间】:2010-12-23 15:38:32
【问题描述】:

我试图简单地将我的程序(用 C# 编写)的标准输出通过管道传输到另一个程序(例如 python 脚本)。我的代码只是使用 Console.Write() 写入标准输出,当我不使用管道时它工作得很好。监听命令只是使用 Console.Write() 从一个单独的线程写入数据,当它来自一个已设置的套接字时。

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

myProgram.exe listen

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

myProgram.exe listen | python filter.py

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

如何判断问题出在 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 听 |蟒蛇过滤器.py 回溯(最近一次通话最后): 文件“filter.py”,第 2 行,在 对于 sys.stdin 中的行: 键盘中断 ^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);
            }
        }
    }
}

【问题讨论】:

  • 您应该尝试缩小问题范围;对于初学者,编写一个简单的 C# 程序,除了写入标准输出流之外什么都不做。如果可行,则在现有程序中设置断点以查看它是否真正到达控制台方法。
  • 我做了一个非常简单的程序来测试两件事。 1. 回显传递的参数将起作用。 2. 写入标准输出的单独线程不是问题。然后我将它传送到 filter.py,两者都有效。我将发布我用作编辑的简单程序。设置断点的问题是我无法找到在 VS 2008 中使用管道调试程序的方法。
  • 你应该在启动工作线程之后执行一个thread.Join(),这样它就可以在程序退出之前完成它的工作。
  • 完成并添加到上面。但它并没有解决问题。
  • 如果您想将调试器附加到您的测试应用程序,请将 Console.ReadKey() 放在顶部,从包括管道在内的命令行运行应用程序。附加 vs.net 调试--> 附加到进程。然后在您运行应用程序的控制台中按一个键。虽然即使使用 Flushes 执行此操作,在 C# 应用程序完成之前我也没有看到 python 脚本的任何输出。

标签: c# python console-application pipe stdin


【解决方案1】:

您的程序是否在其标准输出上编写换行符或调用flush?也许它被缓冲了,这就是为什么你什么都看不到的原因。

【讨论】:

  • 我都试过了。 Console.Out.Write() 与 Console.Out.Flush() 和 Console.Out.WriteLine() 与 Console.Out.Flush()。
【解决方案2】:

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

也许会有所帮助。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多