簡體   English   中英

在python窗口化(Tkinter)應用程序中禁止子進程控制台輸出

[英]Suppress subprocess console output in a python windowed (Tkinter) app

我正在嘗試使用python應用程序執行以下代碼

pyinstaller -w -F script.py

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()

當按下Tkinter按鈕並從按鈕單擊處理程序調用此代碼時,將運行以上代碼。

我的問題是,當我運行exe時,它不會運行ffmpeg。 但是,如果我將命令設置為:

proc = subprocess.Popen(cmd1)

FFMPEG確實運行,我得到了想要的電影文件,但可以看到FFMPEG的控制台窗口。 因此,我最終在電影中獲得了控制台窗口。 (我會盡量減少按鈕單擊處理程序中的Tkinter窗口)

我的問題是如何隱藏控制台窗口,並且仍然以我希望的方式運行FFMPEG? 我查看了以下線程,但無法正常工作: 如何在Python 2.7中隱藏子進程的輸出, 用python最小化或隱藏打開程序

謝謝

謝謝@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消失了。

謝謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM