【问题标题】:Redirecting C# Standard Output and Reading it with Python重定向 C# 标准输出并用 Python 读取它
【发布时间】:2016-08-02 18:00:25
【问题描述】:

我正在尝试从我用 C# 编写的命令行项目重定向标准输出并读取 Python 文件中的数据。

目前,C# 应用程序将从传感器读取的数据写入 CSV 文件。我必须稍后运行 Python 文件来获取和处理数据(必须在 Python 中完成,并且数据收集必须在 .NET 中完成才能使用 SDK)。

我希望能够同时运行 C# 和 Python 项目,并将数据流直接从 C# 传输到 Python 项目,而无需使用中间的本地文件 (CSV)。

我已经在 SO 和 MSDN 文档中进行了自己的搜索。我正在考虑使用 ProcessStartInfo.RedirectStandardOutput Property 来重定向 C# 应用程序的控制台输出。

我还不知道如何从 Python 文件中获取此 Stream 中的数据。 This article 有助于更好地理解如何处理它,但我仍然卡住了。

我也在查看 Python 中的 subprocess.Popen.communicate,但我不确定这是否适用于我的要求。

任何帮助将不胜感激。

【问题讨论】:

  • 您是从 Python 中调用 C# CLI(我想是编译的?)?通过subprocess?您能否为您的问题添加更多细节?
  • 这是一个 Python 问题。如果 C# 项目已经将文本输出到标准输出(例如,使用 Console.Writeline()),则无需对 C# 项目执行任何操作。 Python 是需要重定向标准输出流的那个(假设它产生了 c# 程序)。在 c# 中,重定向充满了注意事项,并且有多种方法可以做到这一点,因此,假设 python 具有相似的复杂性和注意事项,您最好将 c# 程序更改为输出到文本文件,然后将该文本文件读入 python(因为我认为这比捕获重定向输出更容易)。
  • @Kristof 为了清楚起见,我在帖子中添加了更多信息。
  • 只要您的 C# 程序 Console.Writeline 的每一行也写入 CSV 文件,那么您就完成了 c# 程序。至于让 python 捕获那些输出到控制台(输出到标准输出)的行,我环顾四周,发现了例如 this,我从 here 找到了它。正如你所看到的,它不是一个简单的“一个班轮”,总是适用于所有事情。
  • 您是否考虑过使用套接字进行跨进程通信而不是使用标准输出?

标签: c# python stream stdout


【解决方案1】:

感谢@Quantic 提供了一些很棒的资源。使用subprocess.Popen,我可以运行我的 C# 项目的内置 .exe 并将输出重定向到我的 Python 文件。我现在可以print() 将所有输出到 C# 控制台的信息输出到 Python 控制台 (Console.WriteLine())。

Python 代码:

from subprocess import Popen, PIPE, STDOUT

p = Popen('ConsoleDataImporter.exe', stdout = PIPE, stderr = STDOUT, shell = True)

while True:
    line = p.stdout.readline()
    print(line)
    if not line:
        break

这会在 .NET 项目创建时逐行获取控制台输出,并在项目终止时跳出封闭的 while 循环。

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多