让popen和mkvtoolnix一起工作?

2024-06-16 09:42:21 发布

您现在位置:Python中文网/ 问答频道 /正文

现在大多数Matroska视频文件(.mkv)都启用了头压缩。这就破坏了与硬件播放器的兼容性,因此我在很久以前就创建了一批“修复”程序,使用mkvtoolnix重新组装文件,而不使用头压缩。 但奇怪的是,尽管源代码是正确的,但批处理在某些.mkv上不起作用。只是打嗝没有规律。。。在

因此,我今天开始编写一个小的python3.2脚本,其唯一目的是遍历CWD中的.mkv文件,并将它们作为参数使用参数调用mkvtoolnix-.exe。我试着两者都用过os.popen公司()和操作系统()在我准备好的命令上,虽然system()似乎误解了命令,删除了不该使用的双引号,但popen似乎至少可以工作一点。在

这就是我的问题。现在执行脚本,它会为文件夹中的每个.mkv文件创建一个.mkv_修复文件,这很好,但是它的大小只是原始文件的一小部分,并且无法运行。在我看来,popen调用.exe很好,但后来几乎立即终止它,只留下一个未完成的文件。在

我将mkvtoolnix windows可执行文件作为来自here的7zip存档文件,并将它们放在脚本的CWD子目录中。在

我还应该注意到,当从批处理中调用时,可执行文件会生成控制台输出,.py脚本不是这样。在

准则的重要部分:

for file in glob.iglob('*.mkv'):
    if file.count('_fix') == 0:
        print(file)
        convertCMD = '"{0}\mkvtoolnix\mkvmerge.exe" -o "{1}_fix" --engage keep_bitstream_ar_info -A -S --compression -1:none "{1}" -D -S --compression -1:none "{1}" -A -D "{1}"'.format(os.getcwd(),file)
        os.popen(convertCMD)
        print('Converted '+file)

感谢任何帮助。在

附加信息:

通常的mkvtoolnix输出:

^{pr2}$

Tags: 文件命令脚本可执行文件参数osfixexe
2条回答

在os.popen公司是弃用的,而且我没有用过,至少最近几年没有用过,所以我不记得细节了。但文件显示你需要打电话操作系统。等等()等待子进程完成。在

为子流程.Popen您需要对该对象调用wait()以查看它是否已完成。如果在开始下一个之前这样做,输出将不会混合。另一方面,如果您一次启动,您可以使用任意数量的处理器内核,这将是很好的。要避免混合输出,则需要为每个子进程创建一个输出,方法是调用Popen(),并使用指向为此目的打开的文件的stdout参数。这样每次转换都会得到一个日志文件,这很有意义。在

我写了一个脚本,我每天都用它来将一些.srt字幕转换成mkv文件。
以下是相关代码:

import subprocess

mkvmerge_args = [
    mkvmerge_path,
    '-o',
    dest_file_path,
    original_file,
    #other arguments...
    ]

returncode = subprocess.call(mkvmerge_args)

(在我的Ubuntu服务器上运行得很好,它也可以在Windows上运行)

相关问题 更多 >