如何在子进程中编写具有给定条件的命令

how to write a command with given condition in subprocess

我很难弄清楚如何在子进程中编写此命令。

在终端 I 运行 :

ffprobe -i test.avi -show_format -v quiet | sed -n 's/duration=//p' | xargs printf %.0f

运行没问题。 现在在 python 3 中,我想在我的代码中 运行 它,它给了我一个错误。 我试过了

subprocess.call(['ffprobe', '-i', 'test.avi' ,'-show_format', '-v' ,'quiet' ,'|', 'sed' ,'-n' ,'s/duration=//p', '|' ,'xargs printf %.0f'])

subprocess.run(['ffprobe', '-i', 'test.avi' ,'-show_format', '-v' ,'quiet' ,'|', 'sed' ,'-n' ,'s/duration=//p', '|' ,'xargs printf %.0f']) 但是 none 有效。

在终端中,| 用于将一个程序的输出通过管道传输到另一个程序的输入。

你的命令意味着以下流程:

ffmpeg => sed => xargs(并且 xargs 对其输入的每一行分别运行 printf

Python可以轻松接过sedxargs的工作。

你的程序可能会变成:

import subprocess
import re

# subprocess.run() is usually a better choice
completed = subprocess.run(
    [
        'ffprobe',
        '-i', 'test.avi', '-show_format', '-v', 'quiet',
    ],
    capture_output=True,  # output is stored in completed.stdout
    check=True,  # raise error if exit code is non-zero
    encoding='utf-8',  # completed.stdout is decoded to a str instead of a bytes
)

# regex is used to find the duration
for match in re.finditer(r'duration=(.*)$', completed.stdout):
    duration = float(match.group(1).strip())
    print(f'{duration:.0f}')  # f-string is used to do formatting

如果您想在 Python 中的命令之间进行管道传输,请参阅 How to use `subprocess` command with pipes

虽然子进程函数中有一个 shell=True 参数,但它有 security consideration.