2013-06-25 55 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