【问题标题】:Console App Running Wrong Code [closed]控制台应用程序运行错误的代码[关闭]
【发布时间】:2012-02-28 04:09:14
【问题描述】:

我对这个问题感到非常困惑。让我简要介绍一下我正在制作的程序:

我正在构建一个工具,它需要无限量的 python 脚本,运行脚本,解析 StdOut/Err,将这些结果写入数据库。

我一直在自下而上构建它,现在我需要将所有部分拼凑在一起。但是,我一直在调试问题。我通常不制作控制台应用程序,但就我所做的而言,别无选择(即,我的目标是制作一个以 python 脚本作为参数的控制台应用程序)。

因此,在我的命名空间中,我有两个主要类,为了清楚起见,我将它们分成了两个不同的文件。里面的所有功能都是静态的,所以它实际上只是一个组织的东西。这两个文件分别是我编写的 python 运行输出捕获应用程序和我编写的数据库报告应用程序的“Harness”和“Query”。现在我试图让 Harness 的结果进入查询。为了让我的同事更容易维护代码,我试图将它们保存在单独的文件中,以便更容易消化。

问题是,当我启动命令行并导航可执行文件并运行它时,将示例 python 脚本作为参数传递,我只能从应用程序的查询部分获得控制台输出。我在 Harness 文件的 main(string[] args) 函数中放置了一些 Console.WriteLines,但这些从未被写入。只有第二个 Query 类中的代码被执行——排序。

这才是真正让我感到困惑的地方,我的 Harness 应用程序中的一个函数会写入一个日志文本文件,该文件会为运行加上时间戳并报告结果。仍在写入此文本文件。然后我考虑将我的示例 py 文件输出到文本文件,因为我的重定向标准输出显然不起作用。果然,python打开了那个文本文件并写入了它,向我暗示它确实运行了那个代码。

然而,这些日志调用所在的函数包含不输出到控制台的 Console.WriteLines。控制台输出唯一起作用的时间是在应用程序的后半部分。

如果有人能对这些问题有所了解,我真的会挖掘它。我拥有的很多代码都包含一些敏感数据,所以我宁愿不只是大量转储它,我认为没有特定的代码区域与问题相关——诚然我不知道当然。让我知道您需要我提供什么,我会尽力而为。

        List<string> retList = new List<string>();
        // Loads Python
        Process pr = new Process();

        pr.StartInfo.FileName = @"C:\Python27\python.exe";
        pr.StartInfo.Arguments = script;
        Console.WriteLine(script);
        //pr.StartInfo.Arguments = @"C:\PythonProj\hello.py";
        pr.StartInfo.UseShellExecute = false;
        pr.StartInfo.RedirectStandardOutput = true;
        pr.StartInfo.RedirectStandardError = true;

        // Runs Test Script
        pr.Start();
        string output = pr.StandardError.ReadToEnd();
        pr.WaitForExit();
        Console.WriteLine(output);

【问题讨论】:

  • 请出示相关代码。
  • 同意奥斯汀。具体来说,显示您创建/调用新流程的代码。可能没有正确设置属性来处理输入/输出流的重定向。
  • 我将代码编辑到主帖中。而且,就其价值而言,运行代码的工具本身就可以工作。虽然我确实在看到重定向代码时遇到问题,但我在“线束”类中的控制台编写语句都没有输出到控制台

标签: c# python redirect stdout


【解决方案1】:

嗯,正如我所预料的那样,第一个问题是这里可能存在死锁情况。我根本看不到您从标准输出中读取的位置,并且由于您正在重定向输出和错误,因此您需要小心如何从它们中读取,以免死锁。 Process 中重定向属性的 MSDN 页面讨论了这个问题,并提供了足以满足您的目的的代码示例。

如果问题是您没有在控制台中看到进程的输出,那么到目前为止我看不到它应该写在哪里(或从进程中读取)。您是否为了简洁而省略了它?如果有,请附上。

【讨论】:

  • 我将流重定向到字符串 var: output。从底部算起的第 3 行,然后我将其写入控制台两行后用于调试目的。再一次,这段代码完全可以自己运行脚本。只有当我在后半部分添加时,我才会遇到这个问题。
  • 您正在读/写标准错误,但不是标准输出。死锁不是确定的事情,它取决于写入流的数据量以及它们是否能够填满缓冲区。同样,请阅读 MSDN 以了解有关这些死锁的详细信息。
  • 对,好吧,我不完全确定我在寻找什么,因为我在没有“查询”代码的备用项目中反复运行此代码。它正在工作,一遍又一遍。如果您可以让我确切地知道我在寻找什么,因为我已经多次看过这个文档。
  • 好吧,正如我之前所说,您的代码片段中没有“pr.StandardOutput.Read..”调用。基于您将 StandardError 结果称为“输出”这一事实,您认为您在上面的代码片段中获得了标准输出。你不是。如果您省略了该调用,请将其包括在内。如果您还没有包含它,那么您的问题就在那里。
  • 原来我在测试的 python 脚本中遗漏了一个参数,一切都恢复了顺利。傻,傻,我。我花了几个小时才意识到这一点:3 感谢大家的帮助。
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2018-09-09
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多