控制台应用程序运行错误的代码

时间:2012-02-06 17:22:07

标签: c# python redirect stdout

我对这个问题感到很困惑。让我快速介绍一下我正在制作的计划:

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

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

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

问题在于,当我启动命令行并导航可执行文件并运行它传递一个示例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);

1 个答案:

答案 0 :(得分:1)

嗯,正如我所料,第一个问题是你可能遇到死锁情况。我根本没有看到你从标准输出读取的位置,因为你要重定向输出和错误,你需要注意如何从它们读取,这样你就不会死锁。 Process中重定向属性的MSDN页面讨论了这个问题,并且代码示例应该足以满足您的需要。

如果问题是你没有在控制台中看到进程的输出,到目前为止我看不到应该写入的位置(或者从进程中读取)。你为了简洁省略了吗?如果是,请加入。