在python窗口(Tkinter)应用程序中抑制子进程控制台输出

时间:2017-06-15 16:11:22

标签: python ffmpeg subprocess pyinstaller windows-console

我试图在使用

创建的python app可执行文件中运行以下代码
  

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以我想要的方式运行? 我查看了以下主题,但无法使其正常工作: How to hide output of subprocess in Python 2.7Open a program with python minimized or hidden

谢谢

1 个答案:

答案 0 :(得分:2)

谢谢@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在时间到期时消失。

感谢您的帮助!