繁体   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