【问题标题】:Wait subprocess.run until completes its task等待 subprocess.run 直到完成它的任务
【发布时间】:2018-08-20 00:20:18
【问题描述】:

我创建了一个简单的方法,可以像在终端中一样执行命令

from subprocess import PIPE, run

class Command_Line():

    @staticmethod
    def execute(command):
        result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
        print(result)
        return result.stdout

我对上面代码的问题是它不会等到任务/过程完成。假设我使用 ffmpeg 通过以下代码更改视频的帧速率

import Command_Line as cmd    
cmd.execute('ffmpeg -i "000000004.avi" -c copy -y -r 30 "000000004.avi"')

问题在于输出视频,因为它没有完成该过程。我已经搜索了如何等待 Is there a way to check if a subprocess is still running? 但无法将其与我的代码合并。你能分享一下你的经验吗。

谢谢

【问题讨论】:

  • 我使用ffmpeg -i movie.avi movie.mp4 在 Windows 和 Linux 上测试了您的脚本(以增加处理时间)。在我的机器上,subprocess.run 一直等到ffmpeg 进程按照docs 的要求终止。引用:"Wait for command to complete, then return a CompletedProcess instance."
  • “问题在于输出视频,因为它没有完成该过程。”究竟是什么意思?运行脚本时输出的视频是完全没有写入还是太小?是否有任何错误消息?
  • 当我执行我的代码时,视频被破坏了,如果我删除我的代码的那部分视频是好的。有了我的代码,视频的视频长度变为零。所以然后我尝试手动执行上面的命令(通过终端),但它的工作,所以我认为该过程中途终止导致视频被破坏
  • 我再次使用与您使用的 ffmpeg 命令完全相同的命令进行了测试,我认为问题在于您覆盖了输入文件stackoverflow.com/questions/28877049/… 如果我直接在终端中运行此命令,视频也会变得无效。你可以尝试更改输出文件名吗?
  • @Marius 你应该把那个作为答案,这样我就可以给你赏金;)这就是问题所在,我只需要在更改其帧速率之前更改文件名。非常感谢

标签: python-3.x ffmpeg subprocess


【解决方案1】:

根据python documentationsubprocess.run等待进程结束。

问题是ffmpeg overwrites the input file如果输入和输出文件相同,因此输出视频变得不可用。

【讨论】:

    【解决方案2】:

    对我来说subprocess.run() 不会等待第一个命令完成。它也在执行第二个命令!

    因此,它无法找到文件,这是第一个命令的结果(并且是第二个命令的输入)。

        subprocess.run("sh /MGMUST1/SHARED/RESOURCES/CODE/TRANSCRIPTOME/ONCOPEPT/ONCOPEPT_INDIA/Paired_end.QC.sh" + "; cp " + os.path.join("/MGMUST1/SHARED/RESOURCES/CODE/DEMUX-Scripts/QC-RESULTS/", str(pid) +"/"+ str(eid)+"/"+ str(pid)+"_"+str(eid)+".pdf") + " .")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2021-08-14
      相关资源
      最近更新 更多