如何在子进程中编写具有给定条件的命令
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可以轻松接过sed
和xargs
的工作。
你的程序可能会变成:
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.
我很难弄清楚如何在子进程中编写此命令。
在终端 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可以轻松接过sed
和xargs
的工作。
你的程序可能会变成:
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.