2012-02-06 66 views
1

我对此问题感到绝对困惑。让我快速运行我正在编写的程序:控制台应用程序运行错误代码

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

我一直在从底层开始构建它,现在我需要将所有的部分拼凑在一起。不过,我一直在调试问题。我通常不制作控制台应用程序,但为了我所做的目的,没有其他选择(即我的目标是创建一个以python脚本作为参数的控制台应用程序)。

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

问题是,当我启动我的命令行并浏览可执行文件并将其作为参数传递给示例python脚本时,我只从应用程序的查询一半获得控制台输出。我已经在Harness文件的main(string [] args)函数中放置了一些Console.WriteLines,但这些函数永远不会写入。只有第二个Query类中的代码才会被执行 - 有点。

这里是东西真的开始混淆我的地方,我的线束中的一个功能是应用程序的一半写入日志文本文件,该文件的时间标记运行并报告结果。该文本文件仍在写入。然后我想我的示例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

请显示一些相关的代码。 – 2012-02-06 17:41:14

+0

同意奥斯汀。具体来说,显示您创建/调用新流程的代码。这些属性可能没有正确设置来处理输入/输出流的重定向。 – Servy 2012-02-06 17:43:13

+0

我将代码编辑到主帖子中。 而且,值得一提的是,运行代码的线束本身就可以工作(编辑)。虽然看到重定向代码时确实遇到问题,但“harness”类中的控制台写入语句没有输出到控制台 – Wuzseen 2012-02-06 17:48:28

回答

1

好吧,第一个问题,正如我所预料的那样,是您在这里可能存在死锁情况。我没有看到你从标准输出中读取的内容,既然你重定向了输出和错误,你需要小心你如何从它们读取,以避免死锁。 Process中重定向属性的MSDN页面讨论了这个问题,并提供了足够满足您需要的代码示例。

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

+0

我将该流重定向到字符串var:output。从底部开始第三行,然后我写它来控制两行以用于调试目的。再次,这段代码自行运行脚本绝对好。只有当我在下半场补充时,我是否会遇到这个问题。 – Wuzseen 2012-02-06 18:03:28

+0

您正在读/写标准的ERROR,但不是标准的OUTPUT。死锁并不是一件确定的事情,它取决于写入数据流的数据量以及是否能够填充缓冲区。再次,请阅读MSDN以获取有关这些死锁的详细信息。 – Servy 2012-02-06 18:19:15

+0

对,嗯,我不完全确定我在找什么,因为我在没有“查询”代码的替代项目中反复运行此代码。它正在工作,一遍又一遍。如果你能让我确切地知道我在找什么,因为我多次看过这个文档。 – Wuzseen 2012-02-06 18:21:55

相关问题