2013-06-25 28 views
0

我从python环境运行DOS命令,通过stdout检索其命令输出。检索隐藏控制台的命令输出?

所有工作都很好,除了每次脚本运行时窗口控制台弹出,所以我需要一种方法来隐藏Windows控制台。

示意,这里是预期的过程:

"Console1" runs "hidden Console2" and retrieves its output into "Console1" 

我喜欢“HiddenStart”或“CHP”软件执行DOS命令和批处理脚本时隐藏控制台读了一些建议。在VBScript另一种解决方案也能达到这样的结果用下面的代码:

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs 
strArgs = "cmd /c COMMAND GOES HERE" 
oShell.Run strArgs, 0, false 

但不幸的是,既不是“HiddenStart”也不是“CHP”,也不VBScript的脚本允许检索执行的命令的命令输出。 “Chp”输出一个stdout,但仅用于退出进程代码。

有人可能会说,可以将结果记录到磁盘上的文件,然后检索文件的内容,但这不是需要的,会导致更复杂的过程。

所以,我想知道是否可以从隐藏的控制台检索命令输出,是吗?

解决方案:POST的作者

How to avoid console window with .pyw file containing os.system call?

注: 嗨,这是我第一次来这里,这个问题是不是重复而是一种变体。证明这一点的是我之前进行过搜索,在我实际编写问题之前很难找到解决方案。所以,版主需要比这更微妙一些。这是一个链接的相关问题或变体,但我认为不是重复的。谢谢。

+0

http://stackoverflow.com/questions/10025179/python-calling-external-programs-without-opening-console-dos-prompt –

回答

0

甲窗为中心的解决方案可以是基于从一个this VBScript '端口' 上:

mother.py:

import win32com.client 
oWS = win32com.client.Dispatch("WScript.Shell") 
print("A", "mother starts child") 
oEx = oWS.Exec("cscript ..\\vbs\\child.vbs") 
while not oEx.Stdout.AtEndOfStream: 
    print(oEx.Stdout.ReadLine()) 
print("B", "mother done") 

输出:

A mother starts child 
1 child 
2 child 
3 child 
4 child 
5 child 
B mother done 

(ActiveState的Python的3.2.2 ;从print中删除()给出了一个2.x版本(用ActiveState Python 2.5.2进行测试);要使用像dir这样的内在函数,请将“%comspec%/ c” )

+0

谢谢Ekkehard。只是要注意,我使用的是python环境,但不容易访问像pywin32这样的第三方模块。所以,正如我在第一篇文章末尾指出的那样,解决方案是标记“Shell = True”子流程方法,并且按照第一个要求按预期工作。 – ab30

+0

标志解决方案只适用于python,也就是说。从Windows DOS命令中,问题仍然打开。 – ab30

0

尝试使用子过程管道示例来完成此操作。

+0

谢谢,你能更明确吗?这里我在python脚本中使用的代码:process = subprocess.Popen(command.split(),stdout = subprocess.PIPE,stderr = subprocess.PIPE,universal_newlines = True) – ab30

+0

这是真的,但评论不是回答。无论如何,巴恩斯先生。 – ab30