我试图在使用
创建的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.7, Open a program with python minimized or hidden
谢谢
答案 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在时间到期时消失。
感谢您的帮助!