python - 为什么这个带有线程的 Popen 不起作用?

标签 python multithreading tkinter ffmpeg subprocess

我写了一个小 tkinter GUI 来处理 ffmpeg 的 4 个输入。由于子流程需要一些时间,我想对流程进行状态。因此,我使用线程,因此 tkinter 在执行子进程时不会卡住。

我的问题是,通过线程化 ffmpeg 命令会输出 0kb 的目标文件,并且不再向该文件写入任何内容。如果我在没有线程的情况下使用我的函数,一切正常,但 GUI 卡住。

这是代码的主要部分:

def ffmpeg(v0,v1,v2,v3):
    cmd = [ path+'ffmpeg.exe',"-y","-i",v0,"-i",v1,"-i",v2,'-i',v3,'-filter_complex',"[0:v][1:v]hstack[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack,format=yuv420p[v]",'-map',"[v]","out.mp4"]
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    while True:
        output = process.stdout.readline()
        inpu = process.stderr.readline()
        if output == b'' and process.poll() is not None:
            break
        if output:
            print(output.strip()) # HERE i will insert into tkinter textfield
    rc = process.poll()

def buttonClick(v0,v1,v2,v3):

    #ffmpeg(v0,v1,v2,v3) # This line works
    t = threading.Thread(target=ffmpeg,args=(v0,v1,v2,v3,)) #This doesn't work
    t.start()
    #t.join()

#tkvar list elements are absolute paths to the videofiles
submitButton = Button(mainframe, text="Process Video", command=lambda: buttonClick(tkvar[0].get(),tkvar[1].get(),tkvar[2].get(),tkvar[3].get()))
submitButton.grid(row = 7, column =3)

为什么我的线程不起作用?

最佳答案

问题是
process.stdout.readline()
始终为空,因为 ffmpeg 始终将所有内容写入 stderr。

关于python - 为什么这个带有线程的 Popen 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53170019/

相关文章:

python - 为什么求幂从右到左?

python - python中面向对象的构造等价于什么?

python - Tkinter 对话框 showinfo 循环错误

python - tkinter Canvas 窗口无法从Powershell打开

python - 如何将附加参数传递给 handle_client 协程?

Python:如何将列表中的所有值转换为其 ascii 值?

c++ - 在启动新线程的成员函数中正确捕获 (lambda) 和安全问题 (C++11/14)

android - 在非UI线程android中运行代码

java - 是否可以拥有一组线程池来共享大型线程池中的线程而不是创建新线程?

python - TKinter:捕获按键时无响应