2012-10-31 24 views
1

我試圖創建一個程序(它將在Windows上使用)來壓縮7-Zip和其他東西的文件列表。防止關閉通過子進程打開的DOS shell窗口

我使用subprocess以正確的參數運行7-Zip可執行文件。 subprocess7z.exe輸出打開DOS shell;這很好,因爲有一個百分比文件壓縮指標,有時這個過程可能會很長。我的問題是,用戶將能夠-自願或意外,中斷在DOS窗口的關閉按鈕壓縮任務,或者通過

  1. 點擊,或
  2. Ctrl鍵 - Ç

是否可以禁用從subprocess打開的任何類型的輸入到DOS shell?另外,如何在運行時將DOS外殼的輸出傳遞給我的程序?我嘗試了process.stdout.read(1024)process.communicate(),但是在子進程結束時都讀取輸出;不是在運行時。

我已經使用subprocess.Popen()而不是subprocess.call(),這樣我可以同時運行所有7-Zip任務,但是如果能夠幫助解決我的問題,我可以改變它。

for f in self.fileList: 
    destination = self.newPath + "\\" + basename(f) + ".7z" 
    arglist = [self.sevZipPath, "a", "-mx9", destination, f] 
    sp = subprocess.Popen(
     args = arglist, 
     cwd = self.newPath, 
     shell = False 
     ) 

回答

2

可以在startupinfo設置一個標誌,隱藏窗口,並設置stdout=subprocess.PIPE捕捉過程的輸出。

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW 
startupinfo.wShowWindow = subprocess.SW_HIDE 
sp = subprocess.Popen(..., stdout=subprocess.PIPE, startupinfo=startupinfo) 

請記住,STARTUPINFO僅適用於Windows。

+0

不幸的是,這在我的情況下不起作用,因爲據我瞭解,我發現讀取標準輸出的所有函數都要等到子進程結束。這意味着所有的應用程序都會凍結,直到子進程結束,並且只有當它結束時,我才能打印所有輸出到目標文件。 – BigDie

+0

你嘗試過'sp.stdout.read(1)'? – lqs