2017-06-15 84 views
1

我試圖運行在Python應用程序可執行以下代碼所做使用禁止子控制檯輸出(Tkinter的)應用程序

pyinstaller -w -F script.py

:當按下一個按鈕的Tkinter

def ffmpeg_command(sec): 
    cmd1 = ['ffmpeg', '-f','gdigrab','-framerate',config.get('FFMPEG_Settings','Framerate'),'-i','desktop',gen_filename_from_timestamp_and_extension()] 


    proc = subprocess.Popen(cmd1,stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 

    duration = sec 
    sleeptime = 0 
    while proc.poll() is None and sleeptime < duration: 
     # Wait for the specific duration or for the process to finish 
     time.sleep(1) 
     sleeptime += 1 

    proc.terminate() 

上面的代碼運行,該代碼是從按鈕單擊處理程序調用。

我的問題是,當我運行的EXE這不運行的ffmpeg。 但是,如果我設置的命令是:

proc = subprocess.Popen(cmd1) 

FFMPEG不跑,我得到我想要的電影文件,但我可以看到FFMPEG控制檯窗口。所以我最終得到了電影中的控制檯窗口。 (我照顧最小化按鈕點擊處理程序中的Tkinter窗口)

我的問題是我如何取消控制檯窗口並仍然按照我想要的方式運行FFMPEG? 我看着下面的線程,但不能使它工作: How to hide output of subprocess in Python 2.7Open a program with python minimized or hidden

謝謝

+0

嘗試添加參數** shell = True ** to proc = subprocess.Popen(cmd1,stdout = subprocess.DEVNULL,stderr = subprocess.DEVNULL) – Stack

+0

@Stack - 感謝您的評論。我試了一下修改於:'proc等於subprocess.Popen(CMD1,殼=真,標準輸出= subprocess.DEVNULL,標準錯誤= subprocess.DEVNULL)'但是如果你使用的是Windows,我仍然得到同樣的結果:( –

+0

7或以上,你可能有一個壞的標準輸入手柄。通過'標準輸入= subprocess.DEVNULL'更換。但是,手柄設置爲'NUL'設備不會阻止控制檯的分配或隱藏。'殼= True'將通過'STARTUPINFO'隱藏它,但最好避免使用shell,並且最好不要連接到控制檯。定義'DETACHED_PROCESS = 8'並使用'creationflags = DETACHED_PROCESS'。 – eryksun

回答

1

謝謝@Stack和@eryksun! 我更改爲以下代碼:

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
startupinfo.wShowWindow = subprocess.SW_HIDE 
cmd1 = ['ffmpeg', '-f','gdigrab','-framerate',config.get('FFMPEG_Settings','Framerate'),'-i','desktop',gen_filename_from_timestamp_and_extension()] 
proc = subprocess.Popen(cmd1,stdin=subprocess.DEVNULL,stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,startupinfo=startupinfo) 

實現了我想要的。 事實上,正如@eryksun建議,只將輸出重定向沒有做到這一點,我不得不使用stdin=subprocess.DEVNULL以及抑制所有輸出。

這仍然留在控制檯窗口可見,但通過上述設置startupinfo,該控制檯窗口被隱藏。 也驗證了當時間到期時FFMPEG消失。

謝謝你的幫助!

+0

你說你保留'shell = True',但是你沒有在上面的代碼中使用它,這是最好的,因爲這個命令不需要shell。我仍然建議告訴Windows不要通過'DETACHED_PROCESS'創建標誌來創建控制檯。 – eryksun

相關問題